線性表的建立與使用
阿新 • • 發佈:2018-12-12
我學的是資料結構這本書,開篇就是線性表,剛接觸的時候真的事一竅不通,後來看了不少的部落格才慢慢明白,下面是我的線性表程式碼,把main函式去掉就可以當頭檔案用,不會的朋友可以參考一下。
#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define OVERFLOW -2 #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int ElemType; typedef int Status; typedef struct//如果不是指標一般是stu[0].elem,指標一般是p->elem; { ElemType *elem; int length; int listsize; }SqList; Status InitList_Sq(SqList *L)//此表的建立並不同與連結串列,此表不返回head,所建立的L就是實體,是在L這個結構體上建立的的, { //並不是定義的指標代表的,而L是主函式傳給他的,L就是100空間的表,大小固定 L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem)exit(OVERFLOW); L->length=0; L->listsize=LIST_INIT_SIZE; return OK; } Status DestroyList(SqList *L) { free(L); return OK; } Status ClearList(SqList *L) { L->length=0; return 1; } Status ListEmpty(SqList *L) { return L->length==0?FALSE:TRUE; } Status ListLength(SqList *L) { return L->length; } Status getElem(SqList L,int i,ElemType *e) { if(i<1||i>L.length)return 0; *e=L.elem[i-1]; return OK; } Status lookup(SqList L,ElemType e) { int i; ElemType *p; p=L.elem; for(i=0;i<L.length&&*p++!=e;)i++; if(i<L.length)return i+1; else return 0; } Status insert(SqList *L,int i,ElemType e) { int j; ElemType *newbase; if(i<1||i>L->length+1)return ERROR;//0之前無元素 if(L->length>=L->listsize) { newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase)exit(OVERFLOW); L->elem=newbase; L->listsize+=LISTINCREMENT; } for(j=L->length;j>=i;j--) L->elem[j]=L->elem[j-1]; L->elem[i-1]=e; L->length++; return 1; } Status deletes(SqList *L,int i,ElemType *e) { int j; if((i<1)||(i>L->length))return ERROR; *e=L->elem[i-1]; for(j=i-1;j<=L->length-1;j++) L->elem[j]=L->elem[j+1]; L->length--; return OK; } Status print(SqList L) { int i; printf("\n\n"); for(i=0; i<L.length; i++) { printf("%d ",L.elem[i]); } printf("\n\n\n"); return 0; } Status scan(SqList *L) { int i,n; printf("輸入元素個數\n"); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&L->elem[i]); L->length++; } return 0; } int main() { int k; ElemType e; SqList L;//如果是*L,那麼定義的是一個SqList型別的指標,那麼傳過去的是一個未知的地址,大小為這個型別的 if(InitList_Sq(&L)==OK)printf("successful!\n");//結構體大小,如果是實體L的地址,那麼首地址已知,空間為100. else printf("defaule!\n"); printf("get numbers\n"); scan(&L); print(L); for(;;) { printf("\n"); printf("1.DestroyList 2.ClearList 3.ListEmpty 4.ListLength\n5.getElem 6.lookup 7.insert 8.deletes 9.exit\n"); scanf("%d",&k); switch(k) { case 1:if(DestroyList(&L))printf("DestroyList is OK\n");break; case 2:if(ClearList(&L))printf("ClearList is OK\n");break; case 3:if(ListEmpty(&L))printf("The List is exist!\n");break; case 4:printf("The ListLength is %d\n",ListLength(&L));break; case 5: { int i; printf("輸入要查詢的編號\n"); scanf("%d",&i); if(getElem(L,i,&e))printf("第%d個是%d\n",i,e);break; } case 6: { int e,pos; printf("輸入要查詢的值\n"); scanf("%d",&e); pos=lookup(L,e); if(pos>0)printf("位置是%d\n",pos); else printf("not found\n"); break; } case 7: { int i,e; printf("輸入插入的位置和值\n"); scanf("%d %d",&i,&e); insert(&L,i,e);print(L);break; } case 8: { int e,i; printf("輸入刪除的位置\n"); scanf("%d",&i); deletes(&L,i,&e);print(L);break; } case 9:break;break; default:printf("error!\n"); } } printf("goodbye\n"); return 0; }