数据结构严蔚敏上机代码完整版.docx
- 文档编号:8454231
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:18
- 大小:76.09KB
数据结构严蔚敏上机代码完整版.docx
《数据结构严蔚敏上机代码完整版.docx》由会员分享,可在线阅读,更多相关《数据结构严蔚敏上机代码完整版.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构严蔚敏上机代码完整版
数据结构
第一、二次上机:
#includc
#includc
#includc
#dcfineTRUE1
#dcfineFALSE0
#dcfineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
definelist_init_size100〃线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
typcdefintStatus;typcdcfintElemType:
typedefstmct{ElemType统lcm;intlength;intlistsize:
//存储空间基址
〃当前长度
〃当前分配的存储容量(以sizcof(ElcmTypc)为单位)
JSqList;
StatusInitList_Sq(SqList&L){
//构造一个空的线性表L
L.elem=(ElemType*)malloc(listJnicsize*sizeof(ElemType));if(!
L.elem)exit(OVERFLOW);//存储分配失败
L.length=0;〃空表长度为0
L.listsize=listjnit_sizey/初始存储容量
returnOK:
)//Initlist_Sq
StatusListInsert_Sq(SqList&LJnti.ElemTypee){
〃在顺序线性表L中第i个位置之前插入新的元素e,
//i的合法值为1<=i<=ListLcngth_Sq(L)+1ElemType*p,*q,*newbase;〃左义指针
if(i
//i值不合法
if(L.length>=L.listsize){
newbase=(ElemType
〃当前存储空间已满,增加分配
*)realloc(L.elem
(L」istsize
+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)exit(OVERFLOW);//存储分配失败
L.elem=newbase;〃新基址
L.listsize+=LISTINCREMENT;//增加存储容量
}
q=&(L.elem[i-1]);〃q为插入位置
for(p=&(L.clcm[L.lcngth-l]);p>=q;-p)
*(p+l)=*p;//插入位置及之后的元素右移
*q=e;〃插入e
++L.length;〃表长增1
returnOK;
)//ListInsert_Sq
StatusListDclete_Sq(SqList&L,intLElcmTypc&c){
〃在顺序线性表L中删除第i个元素,并用c返回其值
//i的合法值为l<=i<=ListLength_Sq(L)
if(i<=L.length)returni;
elsereturn0;
)//LocateEIem_Sq
voidMergeList_Sq(SqListLa.SqListLb,SqList&Lc){
〃已知顺序线性表La和Lb的元素按值非递减排列
〃归并La和Lb得到新的顺序线性表Lc,Lc的元素也按非递减排列
ElemType*pa,*pb,*pc,*pajast,*pbJast;
pa=La.elem;
pb=Lb.elem;
Lc.listsize=Lc」ength=La」ength+LK1ength;
pc=Lc.eleni=(ElemType*)inalloc(Lc.listsize*sizeof(ElemType));
if(!
Lc.elem)exit(OVERFLOW);//存储分配失败
paJast=La.elem+La.length-1;
pb_last=Lb.elem+Lb」ength-1;
while(pa<=pa_last&&pb<=pb」ast)
{
〃归并
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last)*pc++=*pa++;〃插入La的剩余元素
while(pb<=pb_last)*pc++=*pb++:
〃插入Lb的剩余元素
)//MergeList_Sqvoidmain()
SqListL;〃龙义线性表
InitList_Sq(L)y/调用空表
〃插入数据
ListInsert_Sq(L」,10);
ListInsert_Sq(L,2,20);
ListInsert_Sq(L」,30);
ListInsert_Sq(L,3.40);
printf(H插入后:
\nH);
display(L)7/调用循环函数
ListInsert_Sq(L3J00);//在L表第三个位置插入100printf(H插入后:
\nH);
display(L);
ElemTypec;〃定义e
ListDclete_Sq(L.3,e)y/删除L表的第三个元素,用e表示print”删除后:
\nH);
display(L);
printf("被删除元素:
%d\n\n\n\nH,e);
*/
SqListLa.Lb.Lc:
InitList_Sq(La);
ListInsert_Sq(La丄3);
ListInsert_Sq(La,2,5);
ListInsert_Sq(La,3,8);
ListInsert_Sq(La,4Jl);
printfC'La插入后:
\nN);
display(La);
InitList_Sq(Lb);
ListInsert_Sq(Lb」,2);
ListInsert_Sq(Lb,2,6);
ListInsert_Sq(Lb3,8);
ListInsert_Sq(Lb,4,9);
ListInsert_Sq(Lb,5J1);
ListInsert_Sq(Lb,6,15);
ListInsert_Sq(Lb,7,20);
printf(HLb插入后:
\nH);
display(Lb);
MergeList_Sq(La,Lb.Lc);
printfC*归并后:
\n");
display(Lc);
printf(H\nH);
inta=LocateElem_Sq(Lc,5);
printf(H%d\n,\a);
}
第三次上机:
#includc
#includc
#dcfineTRUE1
#dcfineFALSE0
#defineOK1
#defineERROR0
#dcfineINFEASIBLE-1
#dcfineOVERFLOW-2
typedefintStatus;
typedefintElemTypc:
typedefstmetLNode
{
ElemTypedata;
structLNode*next;
}LNOdc卢LinkList;
StatusGetElem_L(LinkListL.inti.ElemType&c)
{
//L为带头结点的单链表的头指针
〃当第i个元素存在时,其值賦给e并返回OK,否则返回ERRORLinkListp;
p=L->next:
intj=l;〃初始化,p指向第一个结点,j为计数器
while(p&&jvi)
{
〃顺指针向后查找,直到p指向第i个元素或p为空p=p->next:
++j;
}
if(!
pllj>i)
returnERROR;〃第i个元素不存在
e=p->data;〃取第i个元素
returnOK:
)//GetEIem_L
StatusListInsert_L(LinkList&LJnti,ElemTypee)
{
〃在带头结点的单链线性表L中第i个位宜之前插入元素e
LinkListp,s;
p=L;
intj=0;
while(p&&jvi・l)
p=p->next;
++j;
}〃寻找第i-1个结点
if(!
pllj>i-l)returnERROR;//i小于或者大于表长+1s=(LinkList)nialloc(sizeof(LNode));〃生成新结点
s->data=e;
s->next=p->next;〃插入L中
p->next=s;
returnOK:
}//ListInsert_L
StatusListDeIete_L(LinkList&L・inti.ElemType&c)
{
〃在带头结点的单链线性表L中,删除第i个元素,并由c返回其值
LinkListp.q;
p=L;
intj=0;
while(p->next&&j { 〃寻找第i个结点,并令p指向其前趋 p=p->next;++j; } if(! (p->next)llj>i-l)returnERROR;〃删除位垃不合理 q=p->next; p->next=q->next;〃删除并释放结点 e=q->data; free(q); returnOK; )//ListDelete_L voidCreateList_L(LinkList&Ljntn) { 〃逆位序输入n个元素的值,建立带表头结点的单链线性表L LinkListp; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL: 〃先建立一个带头结点的单链表 for(inti=n;i>0;-i) { p=(LinkList)malloc(sizeof(LNode));〃生成新结点 scanf(n%dM,&p->data);〃输入元素值 p->next=L->next: L->next=p;〃插入到表头 } )//CreateList_L voiddisplay(LinkListL) {LinkListp=L->next; 〃泄义for循环函数while(p) ( printf(n%d/\p->data);p=p->next; } printfC'Xn11); } voidinain() { LinkListL; CreateList_L(L.3);display(L); ListInsert_L(L,2J00);display(L); ElemTypee; ListDelete_LXL,2,e);display(L); printfC被删除的值=%d\n”,e); GetElem_L(U3x); prin叱获取的值=%d\n,\e); } 第四次上机 #include include #includc #dcfineTRUE1 #dcfineFALSE0 #defineOK1 #dcfineERROR0 #dcfineINFEASIBLE-1 #defineOVERFLOW-2typcdefintSElemType;typcdefintStatus; #dcfineSTACKJNIT_SIZE100 #dcfineSTRCKINCREMENT10typcdefstmct{ SElemType*base; //存储空间初始分配量 〃存储空间分配增量 //在栈构造之前和销毀之后,base的值为NULL SElemTypc*top: 〃栈顶指针 intstacksize; JSqStack; 〃当前已分配的存储空间,以元素为单位 StatusInitStack(SqStack&S){ //构造一个空栈s S.base=(SElemT\fpe*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(! S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base; S.stacksize=STACKJNIT_SIZE; returnOK: }//InitStack StatusGetTop(SqStackS.SElemType&c){ 〃若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base) returnERROR; e=*(S.top-1); returnOK: )//GetTop StatusPush(SqStack&S.SElemTypee){ //插入元素e为新的栈顶元素 if(S.top・S.base>=S.stacksize){ //栈满,追加存储空间 S.base=(SElemType*)realloc(S.baseJS.stacksize+STRCKINCREMENT)*sizeof(SElemType)); if(! S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base+S.stacksize; S.stacksize+=STRCKINCREMENT: *S.top++=c: returnOK; )//Push StatusPop(SqStack&S.SElemType&c){ 〃若栈不空,则删除S的栈顶元素,用e返回其值,并返回0K;否则返回ERROR if(S.top=S.base)returnERROR; e=*-S.top; returnOK: }//Pop StatusStackEmpty(SqStackS){ if(S.top=S.base) returnTRUE; elsereturnERROR: }voidconversion(){ //对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 SqStackS; intN; SElcmTypce; InitStack(S);〃构造空栈 scanf(,,%d,\&N); while(N){ Push(S,N%8); N=N/8; } printf(”转换成八进制后的数为: ”); while(! StackEmpty(S)){ Pop(S.e); printf(,,%d,\e); } printf(H\nM); }//conversionvoidmain() { SqStackS; SElemTypec,x; InitStack(S); Push(S・5); Push(S・4); Push(S・3); Push(S・2); Push(SJ); GetTop(Sx);printfC*栈顶元素为%d\ii'\e); printf(H\n,r); Pop(S.x); printfC'删除的栈顶元素为%d\n",x); printf(,,\nH); printfC'输入一个十进制数: ”);conversion(); } 第五次上机 /*队列的链式存储钉 include include #includc #dcfineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 typedefintQElemT\pe; typcdcfintStatus; typedefstmetQNode{ QElemTypedata;structQNode*next; }QNode,*QueuePtr; typedefstnict{ QueuePtrfront;〃队头指针 QueuePtrrear;〃队尾指针 JLinkQueue; StatusInitQueuc(LinkQueue&Q){ //构造一个空队列Q Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(! Q.front)exit(OVERFLOW);//存储分配失败 Q.front->next=NULL; returnOK: } StatusDestroyQueue(LinkQucue&Q){ 〃销毁队列Q while(Q.front){ Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } returnOK: } StatusEnQueue(LinkQueue&Q.QElcmTypce){ 〃插入元素e为Q的新的队尾元素 QueuePtrp; p=(QueucPtr)maIloc⑸zcof(QNodc)); if(! p)exit(OVERFLOW);//存储分配失败 p->data=e; p->next=NULL; Q.rear・>next=p; Q.rear=p: returnOK: } StatusDeQucue(LinkQueue&Q.QElemType&c){ 〃若队列不为空,则删除Q的队头元素,用e返回其值,并返回0K: 〃否则返回ERROR QueuePtrp; if(Q.front=Q.rear)returnERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); returnOK: ) voiddisp(LinkQueucQ) { QueuePtrp; p=Q.front->next; 〃左义for循环函数 while(p) { printf(H%d*\p->data);p=p->next: } printf(M\nH); ) voidmain() { LinkQueueQ; QElemTypee; InitQueue(Q); printf("插入的元素为: \n"); EnQueue(Q,25); EnQueue(Q.5); EnQueue(QJ2); EnQueue(Q,60); EnQueue(Q33); disp(Q); printfC删除队头元素后: \nH); DeQueue(Qx); disp(Q); DestroyQueue(Q); if(DestroyQueue(Q)=1)printfC销毁队列成功! \n");else printfC销毁队列失败! \n"); } 附加: /*队列的顺序存储*/ //最大队列长度 #dcfineMAXQSIZE100 typcdefstmct{QElemType*baseintfront;intrear; JSqQueue; //初始化的动态分配存储空间 〃头指针,若队列不空,指向队列头元素 〃尾指针,若队列不空,指向队列尾元素的下一个位置 StatusInitQueue(SqQueue&Q){ 〃构造一个空队列 Q.base=(QElcmTypc*)malloc(MAXQSIZE*sizeof(QElcmType));if(! Q.base)exit(OVERFLOW);//存储分配失败 Q.front=Q.rear=0; returnOK; } intQueueLenth(SqQueueQ){ 〃返回Q的元素个数,即队列的长度 return(Q.rear・Q.from+MAXQSIZE)%MAXQSIZE: } StatusEnQueue(SqQueue&Q.QElemTypee){ 〃插入元素e为Q的新的队尾元素 if((Q.rear+1)%MAXQSIZE==Q.front)returnERROR;〃队列满Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; returnOK: } StatusDeQueue(SqQueue&Q.QElemType&c){ 〃若队列不为空,则删除Q的队头元素,用e返回其值,并返回OK: 〃否则返回ERROR if(Q.front=Q.rear)returnERROR; e=Q.base[Q.front]; Q.front=(Q.front+l)%MAXQSIZE: returnOK: } 第六次上机 #includc #includc #includc #defineTRUE1 #dcfineFALSE0 #dcfineOK1 #defineERROR0 #defineINFEASIBLE-1 #dcfineOVERFLOW-2 typcdcfintStatus; typedefcharTElemType; //二叉树的二叉链表存储表示 typedefstmetBiTNode{ TEIemT\-pedata; structBiTNode*lchild? rchild;//左右孩子指针 }BiTNode,*BiTree; StatusCrcatcBiTree(BiTree&T){ //按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树, 〃构造二叉树链表表示的二叉树T charch; scai】f(”%c: &ch); if(ch=**) T=NULL; else{ if(! (T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW); T->data=ch;〃生成根结点 CreateBiTree(T->lchild);〃构造左子树 CreateBiTree(T->rchild);〃构造右子树 } returnOK; )//CreateBiTrec voidPreOrderTraverse(BiTreeT){ 〃先序遍历 printf(H%cgdata);〃输出结点 PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } voidInOrderTraverse(BiTreeT){ 〃中序遍历 PreOrderTraverse(T->lchild); print
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 严蔚敏 上机 代码 完整版