順序表的 C 語言實現
阿新 • • 發佈:2018-11-26
#include <stdio.h> #include <stdlib.h> #define OK 1 #define OVERFLOW 0 #define ERROR -1 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int ElemType; typedef struct { // 定義陣列儲存資料元素的最大值 char *elem; // 定義線性表當前長度 int length; // 線性表的長度 int listsize; }SqList; // 線性表的初始化 int InitList(SqList &L) { L.elem = (char *)malloc(LIST_INIT_SIZE*sizeof(char)); if(!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; } // 插入 int ListInsert_Sq(SqList &L,int i,char e) { // i 是要插入的位置 // 如果要插入的位置不在順序表的範圍內就報錯 if(i<1 || i>L.length) { return ERROR; } char *newbase; char *p , *q; // 如果當前長度大於了最大長度就重新分配新的空間 if(L.length >= L.listsize) { newbase = (char*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(char)); if(!newbase) exit(OVERFLOW); L.elem = newbase; L.listsize += LISTINCREMENT; } // 插入操作 // q 為第 i 個元素的位置 ,即要插入的元素的位置 q = &(L.elem[i-1]); // 從後往前遍歷,把 i 後的每一個元素都後移一位 for(p=&(L.elem[L.length - 1]);p>=q;p--) { *(p+1) = *p; } // 把要插入的元素放到 i 這個位置 *q = e; //順序表當前長度增加一個 L.length++; return OK; } // 刪除 int ListDelet_Sq(SqList &L,int i) { int k; if(i<1 || i>L.length) { return ERROR; } if(i<L.length) { for(k=i;k<L.length;k++) { L.elem[k-1] = L.elem[k]; } } L.length--; return OK; } // 查詢 // x 為查詢的值 int LocateElem_Sq(SqList L,char x) { int i = 1; char *p; p = L.elem; while(i<L.length) { if(*p == x) break; else p++; i++; } // 返回這個位置 printf("%d 的位置是 %d\n",x,i); } // 顯示當前順序表的數值 void show(SqList L) { int i; printf("當前順序表的數值情況:\n"); for(i=0;i<L.length;i++) { printf("%d ",L.elem[i]); } printf("\n"); } main() { int y; SqList L; y = InitList(L); if(y == 1) printf("success init\n"); // 先給順序表賦值 for(int i=0;i<10;i++) { L.elem[i] = i; L.length ++ ; } show(L); // 查詢一個數字 8 ,並返回它的位置 LocateElem_Sq(L,8); // 插入一個數字 10 到第八位置 ListInsert_Sq(L,8,10); show(L); // 刪除一個數字 10 ListDelet_Sq(L,8); show(L); // 這個是地址 // printf("%d\n",L); }