每天一個數據結構-----線性表的順序儲存結構
阿新 • • 發佈:2018-12-20
// main.c // List // // Created by Jacobs.Guo on 2018/4/1. // Copyright © 2018年 yage guo. All rights reserved. // #include <stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 typedef int status; typedef int ElemType; typedef struct{ ElemType data[MAXSIZE]; int length; }Sqlist; //初始化線性表 status InitList(Sqlist *l){ l->length = 0; return OK; } //線性表插入元素 status InsertList(Sqlist *l,ElemType e,int position){ // printf("值為%d...%d\n",position,e); int k; if (l->length == MAXSIZE) return FALSE; if (position<1 || position>l->length+1) return FALSE; if (position <= l->length){ for (k = l->length-1 ; k >= position-1 ; k--){ l->data[k+1] = l->data[k]; } } l->data[position-1] = e; l->length++; return OK; } //獲取線性表的長度 int ListLength(Sqlist *L){ return L->length; } //判斷線性表是否為空表 status ListEmpty(Sqlist *L){ if (L->length ==0) return TRUE; else return FALSE; } //將線性表置為空表 status ClearList(Sqlist *L){ L->length = 0; return OK; } //獲取線性表中的元素 ElemType GetElem(Sqlist *L,int position,ElemType *e){ if ( position==0 || position<1 || position>L->length) return ERROR; *e = L->data[position-1]; return OK; } //ListDelete 刪除線性表元素 status ListDelete (Sqlist *L,int position){ int k; if (position<1 || position >L->length) return ERROR; if (position != L->length){ for (k = position-1;k<L->length-1;k++){ L->data[k] = L->data[k+1]; } } L->length--; return OK; } //ListTraverse 遍歷線性表 status ListTraverse(Sqlist *L){ int i; if (L->length == 0) return ERROR; for (i = 0; i<=L->length-1;i++) printf("%d...",L->data[i]); printf("\n"); return OK; } /* 初始條件:順序線性表L已存在 */ /* 操作結果:返回L中第1個與e滿足關係的資料元素的位序。 */ /* 若這樣的資料元素不存在,則返回值為0 */ int LocateElem(Sqlist L,ElemType e) { int i; if (L.length==0) return 0; for(i=0;i<L.length;i++) { if (L.data[i]==e) break; } if(i>=L.length) return 0; return i+1; } //合併兩個線性表 void UnionL(Sqlist *La,Sqlist *Lb){ int La_len,Lb_len,i; ElemType e; La_len=ListLength(La); Lb_len=ListLength(Lb); for (i=1;i<=Lb_len;i++) { GetElem(Lb,i,&e); if (!LocateElem(*La,e)) // printf("值為%d...%d\n",La_len,e); InsertList(La,e,++La_len); } } int main(){ Sqlist L,La; int i; ElemType e; //初始化線性表 if (InitList(&L)) printf("線性表L初始化已完成....\n"); if (InitList(&La)) printf("線性表La初始化已完成....\n"); //線性表是否為空 if(ListEmpty(&L)) printf("線性表L為空表\n"); else printf("線性表L非空\n"); if(ListEmpty(&La)) printf("線性表La為空表\n"); else printf("線性表La非空\n"); for (i = 1; i <= 5 ; i++){ InsertList(&L, i, 1); } printf("在L線性表頭部一次插入1-5之後:線性表的元素為...\n"); printf("線性表的長度為:%d\n",ListLength(&L)); ListTraverse(&L); for (i = 1; i <= 6 ; i++){ InsertList(&La, i+2, 1); } printf("在La線性表頭部一次插入1-5之後:線性表的元素為...\n"); printf("線性表的長度為:%d\n",ListLength(&La)); ListTraverse(&La); printf("在L線性表中第三個位置插入元素10之後:線性表的元素為\n"); InsertList(&L, 10, 3); ListTraverse(&L); if(ListEmpty(&L)) printf("線性表L為空表\n"); else printf("線性表L非空\n"); if (!GetElem(&L,3,&e)) printf("不能找到對應的元素\n"); else printf("線性表中第4個元素值為:%d\n",e); printf("在L線性表中刪除第三個位置的元素之後:線性表的元素序列為\n"); ListDelete(&L, 3); ListTraverse(&L); printf("將線性表La與表L合併後結果為:\n"); UnionL(&L, &La); ListTraverse(&L); printf("元素8所在的位置是:%d\n",LocateElem(L,8)); // 將線性表置為空表 ClearList(&L); printf("線性表L已經置空....\n"); return 0; }