題目
問題描述:已知有兩個遞增的正整數序列A和B,序列中元素個數未知,同一序列中不會有重復元素出現,有可能某個序列為空。你的任務是求這兩個序列的差集A-B與交集A+B。A-B就是僅由在A中出現而不在B中出現的元素所構成的集合,設為C1;A+B就是既在A中出現也在B中出現的元素所構成的集合,設為C2。
要求:
建立四個單鏈表,分別為A、B、C1、C2,並使用A、B這兩個鏈表存儲兩個正整數序列,然后將集合A-B中的元素存儲在鏈表C1中,將集合A+B中的元素存儲在鏈表C2中。正整數序列的輸入是按照遞增順序輸入的,用-1作為結束標志,注意-1不算這個正整數序列中的元素(不要統計-1)。在程序結束前要釋放鏈表A、B、C1、C2中的所有節點。
輸入與輸出要求:依次輸入兩個遞增的正整數序列A和B,序列元素的個數未知,但以輸入“-1”結束,每個正整數序列占一行。輸出鏈表C1中的元素,占一行;然后是鏈表C2中的元素,占一行。每行的每個元素后有一個空格,注意最后一個元素后只有換行符,如果某個鏈表為空則,則輸出“There is no item in XX list.”。
程序運行效果:
Sample 1:
Please input the elements of list A:1 2 3 4 5 6 7 -1
Please input the elements of list B:2 3 6 -1
輸出
The list C1:1 4 5 7
The list C2:2 3 6
Sample 2:
Please input the elements of list A:-1
Please input the elements of list B:-1
輸出
There is no item in C1 list.
There is no item in C2 list.
分析
又是單鏈表,把一個節點插入到另一個鏈表里都要重新申請過空間。因為作業要求注釋,所以我寫注釋寫得好~詳細啊。
/* 天啦嚕,今天去歡樂谷玩得好嗨啊 晚上回來做上機題時,總覺得自己在過山車上失重着,這感覺好持久啊 →_→ */ #include<stdio.h> typedef struct List { int v; struct List *next; } list; list *A,*B,*C1,*C2,*p,*HeadA,*HeadB,*HeadC1,*HeadC2,*p1,*p2,*tmp,*tp,*mp; int main() { int a; //讀list A printf("Please input the element of list A:"); while(~scanf("%d",&a)&&a!=-1) { //先申請空間 p=malloc(sizeof(list)); if(p!=NULL) { //申請成功則把節點p插入到A p->v=a; if(A!=NULL) A->next=p; else HeadA=p; A=p; } } if(A!=NULL)//A可能為空 A->next=NULL; //讀list B printf("Please input the element of list B:"); while(~scanf("%d",&a)&&a!=-1) { p=malloc(sizeof(list)); if(p!=NULL) { p->v=a; if(B!=NULL) B->next=p; else HeadB=p; B=p; } } if(B!=NULL)B->next=NULL; //開始構建C1 p1=HeadA; p2=HeadB; while(p1!=NULL&&p2!=NULL) { //listA的當前元素比listB的小 if(p1->v<p2->v) { //新建節點tp,tp->v為p1的v tp=malloc(sizeof(list)); tp->v=p1->v; //tp插入到C1中 if(C1!=NULL) C1->next=tp; else HeadC1=tp; C1=tp; //list A考慮下一個元素 p1=p1->next; } else if(p1->v==p2->v) { //兩個list都考慮下一個元素 p1=p1->next; p2=p2->next; } else if(p1->v>p2->v) //listB考慮下一個元素 p2=p2->next; } //把list A剩余的元素(不可能與list B沖突了)都插入C1 while(p1!=NULL) { tp=malloc(sizeof(list)); tp->v=p1->v; if(C1!=NULL) C1->next=tp; else HeadC1=tp; C1=tp; p1=p1->next; } if(C1!=NULL)C1->next=NULL; //開始構建C2 p1=HeadA; p2=HeadB; while(p1!=NULL&&p2!=NULL) { if(p1->v<p2->v) p1=p1->next; else if(p1->v==p2->v) { tp=malloc(sizeof(list)); tp->v=p1->v; if(C2!=NULL) C2->next=tp; else HeadC2=tp; C2=tp; p1=p1->next; p2=p2->next; } else if(p1->v>p2->v) p2=p2->next; } if(C2!=NULL)C2->next=NULL; //開始輸出,一邊釋放C1、C2的內存 if(HeadC1==NULL)printf("There is no item in C1 list."); else { printf("The list C1:"); while(HeadC1!=NULL) { tmp=HeadC1; printf("%d ",tmp->v); HeadC1=HeadC1->next; free(tmp); } } if(HeadC2==NULL)printf("\nThere is no item in C2 list."); else { printf("\nThe list C2:"); while(HeadC2!=NULL) { tmp=HeadC2; printf("%d ",tmp->v); HeadC2=HeadC2->next; free(tmp); } } //釋放listA和listB的內存 while(HeadA!=NULL) { tmp=HeadA; HeadA=HeadA->next; free(tmp); } while(HeadB!=NULL) { tmp=HeadB; HeadB=HeadB->next; free(tmp); } return 0; }
