1. 程式人生 > >線性表(順序表和鏈式表)

線性表(順序表和鏈式表)

#include<iostream>
#include<cstdio>
#define LIST_INIT_SIZE 100      //初始數量
#define LISTINCREMENT 10        //增加量
#define LA_INITLEN 3            //La初始長度
#define LB_INITLEN 4            //Lb初始長度
typedef int ElemType;
typedef int Status;

typedef struct {
    ElemType *elem;
    int length;
    int
listsize; }SqList; Status InitList_Sq(SqList &L) { //初始化順序表 L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (!L.elem)exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return 1; } Status GetElem(SqList L, int i,ElemType &e) { //獲取位於i的元素 if
(i<1 || i>L.length )exit(0); e = L.elem[i-1]; return 1; } Status ListInsert_Sq(SqList&L, int i, ElemType e) { //在i位置前插入e if (i<1 || i>L.length + 1)return 0; if (L.length >= L.listsize) { ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType)); if
(!newbase)exit(OVERFLOW); L.elem = newbase; L.listsize += LISTINCREMENT; } int*q = &(L.elem[i - 1]); for (int*p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p; *q = e; ++L.length; return 1; } Status LocateElem(SqList L, int e) { //判斷元素e是否位於L中 int em,i; for ( i = 1; i <= L.length; i++) { GetElem(L, i, em); if (e == em)break; } if (i > L.length)return 0; return 1; } void Union(SqList La, SqList Lb, SqList &Lc) { //順序表並操作 ElemType e; int La_len = La.length; int Lb_len = Lb.length; int Lc_len = Lc.length; for (int i = 1; i <= La_len; i++) { GetElem(La, i, e); ListInsert_Sq(Lc, ++Lc_len, e); } for (int i = 1; i <= Lb_len; i++) { GetElem(Lb, i, e); if (!LocateElem(Lc, e))ListInsert_Sq(Lc,++Lc_len , e); } } void Intersection(SqList La, SqList Lb, SqList &Lc) { //順序表交操作 ElemType e; int La_len = La.length; int Lb_len = Lb.length; int Lc_len = Lc.length; for (int i = 1; i <= La_len; i++) { GetElem(La, i, e); if (LocateElem(Lb, e))ListInsert_Sq(Lc, ++Lc_len, e); } } void Diff(SqList La, SqList Lb, SqList &Lc) { //順序表差操作 int e = 0; SqList Lc2; InitList_Sq(Lc2); Intersection( La, Lb,Lc2); int Lc_len = Lc.length; for (int i = 1; i <= La.length; i++) { GetElem(La,i,e); if (!LocateElem(Lc2, e))ListInsert_Sq(Lc, ++Lc_len, e); } } void Show(SqList L) { //列印順序表所有元素 for (int i = 0; i < L.length; i++) { printf("%d ", L.elem[i]); } printf("\n"); } //==================分界線 typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; Status GetElem_L(LinkList L, int i, ElemType &e) { //獲取連結串列中位於i的元素 LinkList p = L->next; int j = 1; while (p&&j < i) { p = p->next; ++j; } if (!p || j > i)return 0; e = p->data; return 1; } Status List_Insert_L(LinkList&L, int i, ElemType e) { //在位置i前插入元素e LinkList p = L; int j = 0; while (p&&j < i - 1) { p = p->next; ++j; } if (!p || j < i - 1)return 0; LinkList s = (LinkList)malloc(sizeof(LNode)); s->data = e; s ->next = p->next; p->next = s; return 1; } void CreateList_L(LinkList &L, int n) { //建立連結串列 L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; for (int i = n; i > 0; --i) { LinkList p = (LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next = L->next; L->next = p; } } Status LocateElem_L(LinkList &L,ElemType e) { //判斷e是否在連結串列L中 LinkList p = L->next; while (p) { if (e == p->data)break; p = p->next; } if (p)return 1; return 0; } int Getlen_L(LinkList &L) { //獲取連結串列L的長度 LinkList p = L->next; int len = 0; while (p) { len++; p = p->next; } return len; } void Union_L(LinkList &La, LinkList&Lb, LinkList&Lc) { //連結串列並操作 int e; int La_len = Getlen_L(La); int Lb_len = Getlen_L(Lb); int Lc_len = 0; for (int i = 1; i <= La_len; i++) { GetElem_L(La, i, e); List_Insert_L(Lc, Lc_len++, e); } for (int i = 1; i <= Lb_len; i++) { GetElem_L(Lb, i, e); if (!LocateElem_L(Lc, e))List_Insert_L(Lc, Lc_len++, e); } } void Intersection_L(LinkList &La, LinkList&Lb, LinkList&Lc) { //連結串列交操作 ElemType e; int La_len = Getlen_L(La); int Lb_len = Getlen_L(Lb); int Lc_len = 0; for (int i = 1; i <= La_len; i++) { GetElem_L(La, i, e); if (LocateElem_L(Lb, e))List_Insert_L(Lc, Lc_len++, e); } } void Diff(LinkList &La, LinkList&Lb, LinkList&Lc) { //連結串列差操作 ElemType e; LinkList Lcm; CreateList_L(Lcm, 0); Intersection_L(La, Lb, Lcm); int La_len = Getlen_L(La); int Lc_len = Getlen_L(Lc); for (int i = 1; i <= La_len; i++) { GetElem_L(La, i, e); if (!LocateElem_L(Lcm, e))List_Insert_L(Lc, Lc_len++, e); } } void Show_L(LinkList &L) { //列印連結串列所有元素 ElemType e; for (int i = 1; i <= Getlen_L(L); i++) { GetElem_L(L, i, e); printf("%d ", e); } printf("\n"); } void Sq() { SqList La, Lb, Lc; InitList_Sq(La); InitList_Sq(Lb); InitList_Sq(Lc); La.length = LA_INITLEN; Lb.length = LB_INITLEN; for (int i = 0; i < La.length; i++) { scanf("%d", &La.elem[i]); } for (int i = 0; i < Lb.length; i++) { scanf("%d", &Lb.elem[i]); } Union(La, Lb, Lc); printf("Union:\n"); Show(Lc); free(Lc.elem); //每次操作後清空Lc InitList_Sq(Lc); Intersection(La, Lb, Lc); printf("Intersection:\n"); Show(Lc); free(Lc.elem); InitList_Sq(Lc); printf("Diff:\n"); Diff(La, Lb, Lc); Show(Lc); } void Link() { LinkList La, Lb, Lc; CreateList_L(La, LA_INITLEN); CreateList_L(Lb, LB_INITLEN); CreateList_L(Lc, 0); Union_L(La, Lb, Lc); printf("Union:\n"); Show_L(Lc); free(Lc); CreateList_L(Lc, 0); Intersection_L(La, Lb, Lc); printf("Intersection:\n"); Show_L(Lc); free(Lc); CreateList_L(Lc, 0); Diff(La, Lb, Lc); printf("Diff:\n"); Show_L(Lc); } int main() { printf("順序表:(輸入La、Lb元素)\n"); Sq(); printf("============\n"); printf("連結串列:(輸入La、Lb元素)\n"); Link(); return 0; }