#include <stdio.h> #include <stdlib.h> /** * 含頭節點單鏈表定義及基本操作 */ //基本操作函數用到的狀態碼 #define TRUE 1; #define FALSE 0; #define OK 1; #define ERROR 0; //Status函數返回值類型 typedef int Status; //數據元素類型 typedef int ElemType; //單鏈表定義 typedef struct Lnode { ElemType data; //數據域 struct Lnode *next; //指針域 } Lnode, *LinkList; //基本操作1:單鏈表初始化 Status InitList(LinkList *list) { (*list)=(LinkList)malloc(sizeof(Lnode)); (*list)->next=NULL; return OK; } //基本操作11:頭插法建立鏈表,數據保存在ElemType類型的數組中 Status CreateList_H(LinkList *list,ElemType arrData[],int length) { int j; for(j=length-1;j>=0;j--){ //新建結點 Lnode *node; node=(Lnode*)malloc(sizeof(Lnode)); node->data=arrData[j]; node->next=NULL; //插入為1號結點 node->next=(*list)->next; (*list)->next=node; } return OK; } //基本操作13:鏈表元素遍歷輸出 Status ListTraverse(LinkList list) { Lnode *p; p=list; int j=0; printf("序號: 結點數據:\n"); while(p->next){ j++; p=p->next; printf(" (%d) %d\n",j,p->data); } return OK; } //有序表合並,順序表實現。pa,pb分別指向listA,listB首元,pc指向新鏈表表尾 Status MergeList(LinkList *listA,LinkList *listB) { Lnode *pa,*pb,*pc; pa=(*listA)->next; pb=(*listB)->next; pc=*listA; while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } //插入剩余表段 pc->next=pa?pa:pb; //釋放listB頭結點 free(*listB); return OK; } //線性表合並,順序表實現。pa,pb分別指向listA,listB首元 Status UnionList(LinkList *listA,LinkList *listB){ Lnode *pa,*pb; //ra將指向listA尾結點 pa=(*listA); pb=(*listB); while(pb->next){ ElemType data=pb->next->data; while(pa->next&&pa->next->data!=data){ pa=pa->next; } if(pa->next&&pa->next->data==data){ //listA中有目標元素 Lnode *needDelete=pb->next; pb->next=needDelete->next; free(needDelete); //釋放listB中的該結點 } else { Lnode *needInsert=pb->next; //pb->next指向當前結點 //將該結點接入listA尾 pa->next=needInsert; //此時pa為listA的尾指針 pb->next=pb->next->next; needInsert->next=NULL; //listA的 最后結點->next 置空 } pa=(*listA)->next; } free(*listB); //釋放listB頭結點 return OK; } /** * 已知線性表: * list1=(1,7,8),list2=(2,4,6,8,10,11) * 有序表合並:(這里為兩個非遞減線性表list1,list2;合並為一個非遞減線性表,仍作為list1); * 則新的:list1=(1,2,4,6,7,8,8,10,11) * 線性表合並:(合並結果放入list1,“list1 並= list2”) * 則新的:list1=(1,7,8,2,4,6,10,11) */ int main(void){ //定義鏈表 LinkList list1,list2,list3,list4; //鏈表初始化 InitList(&list1); InitList(&list2); InitList(&list3); InitList(&list4); //創建鏈表 ElemType waitInserted1[]={1,7,8,}; ElemType waitInserted2[]={2,4,6,8,10,11,}; ElemType waitInserted3[]={1,7,8,}; ElemType waitInserted4[]={2,4,6,8,10,11,}; int arrLength1=sizeof(waitInserted1)/sizeof(waitInserted1[0]); int arrLength2=sizeof(waitInserted2)/sizeof(waitInserted2[0]); int arrLength3=sizeof(waitInserted3)/sizeof(waitInserted3[0]); int arrLength4=sizeof(waitInserted4)/sizeof(waitInserted4[0]); CreateList_H(&list1,waitInserted1,arrLength1); CreateList_H(&list2,waitInserted2,arrLength2); CreateList_H(&list3,waitInserted3,arrLength3); CreateList_H(&list4,waitInserted4,arrLength4); /* printf("\nlist1:\n"); ListTraverse(list1); printf("\nlist2:\n"); ListTraverse(list2); printf("\nlist3:\n"); ListTraverse(list4); printf("\nlist3:\n"); ListTraverse(list4); */ //有序表合並 MergeList(&list1,&list2); printf("\nlist1:(與list2經過有序表合並后)\n"); ListTraverse(list1); //遍歷測試 //線性表合並 UnionList(&list3,&list4); printf("\nlist3:(與list4經過線性表表合並后)\n"); ListTraverse(list3); //遍歷測試 printf("\nEND"); return 0; }