1. 程式人生 > >資料結構——求集合(單鏈表)的並、交和差運算:

資料結構——求集合(單鏈表)的並、交和差運算:

求集合(用單鏈表表示)的並、交和差運算:
問題描述:該演算法的設計,要求執行結果如下所示:
(包含三種排序)

集合的運算如下:
原 集 合A: c a e h
原 集 合B: f h b g d a
有序集合A: a c e h
有序集合B: a b d f g h
集合的並C: a b c d e f g h
集合的交C: a h
集合的差C: c e

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1

typedef char elemtype;
typedef int Status; typedef struct LNode { elemtype data; struct LNode *next; } LNode,*LinkList; Status InitList(LinkList &L) { L=(LinkList)malloc(sizeof(LNode)); if(!L) exit(-1); L->next=NULL; return OK; } Status ListInsert_L(LinkList &L,int i,elemtype e) { LinkList p=L,q; int
j=0; for(; p&&j<i-1; j++) p=p->next; if(p&&j>i-1) return -1; q=(LinkList)malloc(sizeof(LNode)); q->data=e; q->next=p->next; p->next=q; } Status ListPritnt_L(LinkList &L) { LinkList p=L; for(p=p->next; p; p=p->next) { printf("%c ",p->data)
; } printf("\n"); } Status ListLength(LinkList &L) { int i=0; LinkList p=L->next; while(p) { p=p->next; i++; } return i; } Status ListSort_L1(LinkList &L) { //交換結點的氣泡排序 LinkList p,q,p_prior; int i,j,n; n=ListLength(L); for(i=1; i<n; i++) { p=L->next; q=p->next; p_prior=L; for(j=0; j<n-i; j++) { if((p->data)>(q->data)) { p_prior->next=q; p->next=q->next; q->next=p; //交換後的更新結點情況和沒交換時不同 p_prior=q; q=p->next; } else { p_prior=p; p=q; q=q->next; } } } p=q=p_prior=NULL; } Status ListSort_L2(LinkList &L) { //直接交換內部元素 LinkList p,q; elemtype temp; int i,j,n; n=ListLength(L); for(i=1; i<n; i++) for(j=0,p=L->next,q=p->next; j<n-i; p=q,q=q->next,j++) { if((p->data)>(q->data)) { temp=p->data; p->data=q->data; q->data=temp; } } p=q=NULL; } void BubbleSort(struct LNode * head) { //https://www.cnblogs.com/darkchii/p/7302412.html struct LNode * p, * q, * tail; tail = NULL; while((head->next->next) != tail) { p = head; q = head->next; while(q->next != tail) { if((q->data) > (q->next->data)) { p->next = q->next; q->next = q->next->next; p->next->next = q; q = p->next; } q = q->next; p = p->next; } tail = q; } } LinkList ListMerge_L(LinkList &L1,LinkList &L2) { //L1,L2有序情況的合併 LinkList p=L1->next,q=L2->next; LinkList L3; int i=1; InitList(L3); while(p&&q) { if(p->data<q->data) { ListInsert_L(L3,i++,p->data); p=p->next; } else if(p->data==q->data) { ListInsert_L(L3,i++,p->data); p=p->next; q=q->next; } else { ListInsert_L(L3,i++,q->data); q=q->next; } } while(p) { ListInsert_L(L3,i++,p->data); p=p->next; } while(q) { ListInsert_L(L3,i++,q->data); q=q->next; } return L3; } LinkList ListIntersect_L(LinkList &L1,LinkList &L2) { LinkList p=L1->next,q=L2->next; LinkList L; int i=1,flag=0; InitList(L); while(p) { while(q) { if(p->data==q->data) { flag=1; break; } q=q->next; } if(flag) { ListInsert_L(L,i++,q->data); } p=p->next; q=L2->next; flag=0; } return L; } LinkList ListDifferent_L(LinkList &L1,LinkList &L2) {//就是把交運算改一下 LinkList p=L1->next,q=L2->next; LinkList L; int i=1,flag=1; InitList(L); while(p) { while(q){ if(p->data==q->data) { flag=0; break; } q=q->next; } if(flag) { ListInsert_L(L,i++,p->data); } p=p->next; q=L2->next; flag=1; } return L; } int main() { elemtype A[10]= {'c','a','e','h'}; elemtype B[10]= {'f','h','b','g','d','a'}; int i; LinkList head1,head2,head3,head4,head5; InitList(head1); InitList(head2); for(i=0; A[i]; i++) { ListInsert_L(head1,i+1,A[i]); } printf("原 集 合A:"); ListPritnt_L(head1); for(i=0; B[i]; i++) { ListInsert_L(head2,i+1,B[i]); } printf("原 集 合B:"); ListPritnt_L(head2); ListSort_L1(head1); ListSort_L2(head2); printf("有序集合A:"); ListPritnt_L(head1); printf("有序集合B:"); ListPritnt_L(head2); head3=ListMerge_L(head1,head2); printf("集合的並C:"); ListPritnt_L(head3); head4=ListIntersect_L(head1,head2); printf("集合的交C:"); ListPritnt_L(head4); head5=ListDifferent_L(head1,head2); printf("集合的差C:"); ListPritnt_L(head5); }