第三週 【專案3
阿新 • • 發佈:2018-12-26
/*
二、list.cpp
三、main.cpp
*Copyright (c)2017,煙臺大學計算機與控制工程學院
*All rights reservrd.
*作者:趙楷文
*完成時間:2017年11月09日
*版本號:v1.0
*問題描述: 假設有兩個集合 A 和 B 分別用兩個線性表 LA 和 LB 表示,即線性表中的資料元素即為集合中的成員。設計演算法,用函式unionList(List LA, List LB, List &LC )函式實現該演算法,求一個新的集合C=A∪B,即將兩個集合的並集放線上性表LC中。
一、list.h
#ifndef LIST_H_INCLUDED #define LIST_H_INCLUDED #define MaxSize 50 typedef int ElemType; typedef struct { ElemType data[MaxSize]; int length; } SqList; void CreateList(SqList *&L, ElemType a[], int n);//ÓÃÊý×é´´½¨ÏßÐÔ±í void InitList(SqList *&L);//³õʼ»¯ÏßÐÔ±íInitList(L) void DestroyList(SqList *&L);//Ïú»ÙÏßÐÔ±íDestroyList(L) bool ListEmpty(SqList *L);//Åж¨ÊÇ·ñΪ¿Õ±íListEmpty(L) int ListLength(SqList *L);//ÇóÏßÐÔ±íµÄ³¤¶ÈListLength(L) void DispList(SqList *L);//Êä³öÏßÐÔ±íDispList(L) bool GetElem(SqList *L,int i,ElemType &e);//Çóij¸öÊý¾ÝÔªËØÖµGetElem(L,i,e) int LocateElem(SqList *L, ElemType e);//°´ÔªËØÖµ²éÕÒLocateElem(L,e) bool ListInsert(SqList *&L,int i,ElemType e);//²åÈëÊý¾ÝÔªËØListInsert(L,i,e) bool ListDelete(SqList *&L,int i,ElemType &e);//ɾ³ýÊý¾ÝÔªËØListDelete(L,i,e)#endif // LIST_H_INCLUDED #endif
二、list.cpp
#include <stdio.h> #include <malloc.h> #include "list.h" //ÓÃÊý×é´´½¨ÏßÐÔ±í void CreateList(SqList *&L, ElemType a[], int n) { int i; L=(SqList *)malloc(sizeof(SqList)); for (i=0; i<n; i++) L->data[i]=a[i]; L->length=n; } //³õʼ»¯ÏßÐÔ±íInitList(L) void InitList(SqList *&L) //ÒýÓÃÐÍÖ¸Õë { L=(SqList *)malloc(sizeof(SqList)); //·ÖÅä´æ·ÅÏßÐÔ±íµÄ¿Õ¼ä L->length=0; } //Ïú»ÙÏßÐÔ±íDestroyList(L) void DestroyList(SqList *&L) { free(L); } //Åж¨ÊÇ·ñΪ¿Õ±íListEmpty(L) bool ListEmpty(SqList *L) { return(L->length==0); } //ÇóÏßÐÔ±íµÄ³¤¶ÈListLength(L) int ListLength(SqList *L) { return(L->length); } //Êä³öÏßÐÔ±íDispList(L) void DispList(SqList *L) { int i; if (ListEmpty(L)) return; for (i=0; i<L->length; i++) printf("%d ",L->data[i]); printf("\n"); } //Çóij¸öÊý¾ÝÔªËØÖµGetElem(L,i,e) bool GetElem(SqList *L,int i,ElemType &e) { if (i<1 || i>L->length) return false; e=L->data[i-1]; return true; } //°´ÔªËØÖµ²éÕÒLocateElem(L,e) int LocateElem(SqList *L, ElemType e) { int i=0; while (i<L->length && L->data[i]!=e) i++; if (i>=L->length) return 0; else return i+1; } //²åÈëÊý¾ÝÔªËØListInsert(L,i,e) bool ListInsert(SqList *&L,int i,ElemType e) { int j; if (i<1 || i>L->length+1) return false; //²ÎÊý´íÎóʱ·µ»Øfalse i--; //½«Ë³Ðò±íÂß¼ÐòºÅת»¯ÎªÎïÀíÐòºÅ for (j=L->length; j>i; j--) //½«data[i..n]ÔªËغóÒÆÒ»¸öλÖà L->data[j]=L->data[j-1]; L->data[i]=e; //²åÈëÔªËØe L->length++; //˳Ðò±í³¤¶ÈÔö1 return true; //³É¹¦²åÈë·µ»Øtrue } //ɾ³ýÊý¾ÝÔªËØListDelete(L,i,e) bool ListDelete(SqList *&L,int i,ElemType &e) { int j; if (i<1 || i>L->length) //²ÎÊý´íÎóʱ·µ»Øfalse return false; i--; //½«Ë³Ðò±íÂß¼ÐòºÅת»¯ÎªÎïÀíÐòºÅ e=L->data[i]; for (j=i; j<L->length-1; j++) //½«data[i..n-1]ÔªËØÇ°ÒÆ L->data[j]=L->data[j+1]; L->length--; //˳Ðò±í³¤¶È¼õ1 return true; //³É¹¦É¾³ý·µ»Øtrue }
三、main.cpp
測試截圖:#include "list.h" #include <stdio.h> void unionList(SqList *LA, SqList *LB, SqList *&LC) { int lena,i; ElemType e; InitList(LC); for (i=1; i<=ListLength(LA); i++) //將LA的所有元素插入到Lc中 { GetElem(LA,i,e); ListInsert(LC,i,e); } lena=ListLength(LA); //求線性表LA的長度 for (i=1; i<=ListLength(LB); i++) { GetElem(LB,i,e); //取LB中第i個數據元素賦給e if (!LocateElem(LA,e)) //LA中不存在和e相同者,插入到LC中 ListInsert(LC,++lena,e); } } //用main寫測試程式碼 int main() { SqList *sq_a, *sq_b, *sq_c; ElemType a[6]= {5,8,7,2,4,9}; CreateList(sq_a, a, 6); printf("LA: "); DispList(sq_a); ElemType b[6]= {2,3,8,6,0}; CreateList(sq_b, b, 5); printf("LB: "); DispList(sq_b); unionList(sq_a, sq_b, sq_c); printf("LC: "); DispList(sq_c); return 0; }