1、数据结构作业参考答案作业1. 线性表编程作业:1将顺序表逆置,要求用最少的附加空间。参考答案#include #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;typedef struct ElemType *elem; int leng
2、th; int listsize; SqList;/创建空顺序表Status InitList_Sq( SqList &L ) L.elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof(ElemType); if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return OK;/顺序表在第i个元素之前插入eStatus sxbcr(SqList &L, int i, ElemType e) ElemType *p,*q; if(iL.length+1) re
3、turn (ERROR); else q=&(L.elemi-1); for(p=&(L.elemL.length-1);p=q;-p) *(p+1)=*p; *q=e; +L.length; return (OK); /顺序表显示void xsList(SqList L) int i=L.length,k; for(k=0;ki;k+) printf(%d ,L.elemk); printf(n);/顺序表逆置void nizhi(SqList &L) int i=0,j=L.length-1; ElemType temp; for(;i10-20-30-40);(3)InsertList(
4、):在有序单链表中插入元素x;(4)ReverseList():单链表就地逆置;(5)DelList():在有序单链表中删除所有值大于mink且小于maxk的元素。选作:使用文本菜单完成功能选择及执行。参考答案:#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;typedef struct node ElemType data;
5、 struct node *link;Lnode, *LinkList;/头插法建立单链表void Create_L1(LinkList &L, int n) LinkList p; int i; L=(LinkList)malloc(sizeof(Lnode); L-link = NULL; for (i = n; i 0; -i) p=(LinkList)malloc(sizeof(Lnode); scanf(%d,&p-data); p- link = L- link; L- link = p; /尾插法建立单链表void Create_L2(LinkList &L,int n) Lin
6、kList s, p; int i; L=(LinkList)malloc(sizeof(Lnode); L-data=0; L-link=NULL; p=L; for(i=1;idata); s-link=NULL; p-link=s; p=s; /查找是否存在结点eLinkList dlbcz(LinkList L, ElemType e) LinkList p=L-link; while(p!=NULL & p-data!=e) p=p-link; return (p);/在第i个元素之前插入结点eStatus ListInsert_L(LinkList L, int i, ElemTy
7、pe e) LinkList p = L,s; int j = 0; while (p & j link; +j; if (!p | j i-1) return ERROR; s = (LinkList) malloc ( sizeof (Lnode); s-data = e; s-link = p-link; p-link = s; return OK;/删除第i个结点Status ListDelete_L(LinkList L, int i, ElemType &e) LinkList p = L,q; int j = 0; while (p-link & j link; +j; if (
8、!(p-link) | j i-1) return ERROR; q=p-link; p-link=q-link; e=q-data; free(q); return OK;/求第i个元素值Status GetElem_L(LinkList L, int i, ElemType &e) int j=1; LinkList p=L-link; while(p&jlink; j+; if(!p|ji) return ERROR; e=p-data; return OK;/显示单链表中元素void xsList(LinkList L) LinkList p=L-link; while(p) prin
9、tf(%d ,p-data); p=p-link; /删除大于mink且小于maxk的元素void DelList(LinkList &L, ElemType mink, ElemType maxk) LinkList p=L,q; while(p-link&p-link-datalink; q=p; while(q&q-datalink; p-link=q;/就地升序排序void sh_sort(LinkList &L) LinkList p=L-link,pre=L,q=L-link-link,u; p-link=NULL; while(q) p=L-link; pre=L; while(
10、p&p-datadata) pre=p; p=p-link; u=q-link; pre-link=q; q-link=p; q=u; /就地逆置void nizhi(LinkList &L) LinkList p=L-link,q=L-link-link,u; p-link=NULL; while(q) u=q-link; q-link=L-link; L-link=q; q=u; /有序表插入void yxcharu(LinkList &L, ElemType e) LinkList pre,p,s; pre=L; p=L-link; while(p&p-datalink; s=(Link
11、List)malloc(sizeof(Lnode); s-data=e; s-link=p; pre-link=s;main() LinkList L; int n,i,mink,maxk; ElemType e; char choice=0; while(choice!=q) printf(n*n); printf(1.建立单链表 ); printf(2.取元素值 ); printf(3.查找 n); printf(4.插入 ); printf(5.删除 ); printf(6.显示n); printf(7.删除大于mink且小于maxk的元素值 ); printf(8.就地升序排序n);
12、printf(9.就地逆置 ); printf(a.有序表插入 ); printf(q.退出n); printf(n请选择操作:); fflush(stdin); scanf(%c,&choice); switch(choice) case 1: printf(请输入单链表中结点个数:); scanf(%d,&n); Create_L2(L,n); break; case 2: printf(请输入元素位序:); scanf(%d,&i); GetElem_L(L,i,e); printf(元素值为:%dn,e); break; case 3: printf(请输入要查找的元素:); scan
13、f(%d,&e); if(dlbcz(L,e) printf(查找成功!); else printf(查找失败。); break; case 4: printf(请输入插入位置:); scanf(%d,&i); printf(请输入要插入的元素:); scanf(%d,&e); if(ListInsert_L(L,i,e) printf(插入成功!单链表为:); else printf(插入失败。); break; case 5: printf(请输入删除位置:); scanf(%d,&i); if(ListDelete_L(L,i,e) printf(删除成功!); else printf(
14、删除失败。n); break; case 6: printf(n单链表为:); xsList(L); break; case 7: printf(请输入mink和maxk:); scanf(%d,%d,&mink,&maxk); DelList(L,mink,maxk); break; case 8: sh_sort(L); break; case 9: nizhi(L); break; case a: printf(请输入在有序表中插入的元素值:); scanf(%d,&e); yxcharu(L,e); break; 作业2. 栈、队列、数组非编程作业:1若进栈序列为ABCD,请写出全部可
15、能的出栈序列和不可能的出栈序列。参考答案:可能的出栈序列:(14种) dcba cdba bacd cbda adcb cbad bdca acdb bcda acbd bcad abdc badc abcd 不可能的出栈序列:(10种) dbca dbac dabc dacb dcab cabd cdab bdac cadb adbc 2简要说明循环队列如何判断队满和队空?参考答案:当牺牲一个存储结点,约定以“队列头指针在队列尾指针的下一位置(指环状的下一个位置)上” 作为队列“满”状态的标志时,循环队列判断队满的条件为:(rear+1) % MaxQsize=front;判断队空的条件为:
16、front = rear。3设A为n阶对称矩阵,采用压缩存储存放于一维数组Fn(n+1)/2中(从F0开始存放),请分别给出存放上三角阵时任一矩阵元素aij(1i,jn)的地址计算公式和存放下三角阵时任一矩阵元素aij(1i,jn)的地址计算公式。参考答案:存放上三角阵时,任一矩阵元素aij(1i,jn)的地址计算公式为:存放下三角阵时,任一矩阵元素aij(1i,jn)的地址计算公式为:4写出下面稀疏矩阵的三元组顺序表和十字链表表示。参考答案:编程作业栈采用顺序栈存储,试设计算法实现将表达式转换成后缀表达式输出。例如,输入表达式: a+b/c-(d*e+f)*g 输出其后缀表达式:abc/+d
17、e*f+g*- 参考答案:#include #include #include #define OVERFLOW -2#define OK 1#define ERROR 0#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int Status;typedef char SElemType; typedef char string80; typedef struct SElemType *base; SElemType *top; int stacksize; SqStack; Status InitStack(SqSta
18、ck &S) S.base=(SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return(OK);Status ClearStack(SqStack &S) S.base=(SElemType*)realloc(S.base,STACK_INIT_SIZE *sizeof(SElemType); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stack
19、size=STACK_INIT_SIZE; return(OK);void DestroyStack(SqStack &S) S.stacksize=0; if(S.base) free(S.base); S.base=S.top=NULL;Status StackEmpty(SqStack S) if(S.top=S.base) return true; else return false;SElemType GetTop(SqStack S) SElemType e; if(S.topS.base) e=*(S.top-1); return e;Status Push(SqStack &S
20、, SElemType e) if(S.top-S.base=S.stacksize) /栈满 S.base=(SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) *sizeof(SElemType); if(!S.base) exit(OVERFLOW); S.top=S.base+ S.stacksize; S.stacksize+=STACKINCREMENT; *S.top+=e; return OK;Status Pop(SqStack &S, SElemType &e) if(S.top = S.base) /栈空
21、return ERROR; e =*-S.top; return OK;Status InOP(SElemType c) char Operators=+,-,*,/,(,),#,0; int len=strlen(Operators); for(int i=0;i; break; case (: case #: order=; break; break; case *: case /: switch(curtop) case +: case -: case (: case #: order=; break; break; case (: switch(curtop) case +: orde
22、r=; break; case -: order=; break; case *: order=; break; case /: order=; break; case (: order=; break; case #: order=; break; case -: order=; break; case *: order=; break; case /: order=; break; case (: order=; break; case ): order=; break; break; case #: switch(curtop) case +: order=; break; case -: order=; break; case *: order=; break; case /: order=; break; case ): order=; break; case #: order=; break; break; return order;void Pass( string Suffix, SElemType ch) *Su
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1