線性表的順序表示與實現
阿新 • • 發佈:2019-01-02
/* 線性表是有N個元素的非空有限序列 存在惟一的一個被稱作“第一個”資料的元素 存在惟一的一個被稱作“第後一個”資料的元素 除第一個與最後一個之外,其它元素都存在唯一的一個前驅和唯一的一個後續 複雜的線性表中的元素可以由多個數據項組成 同一個線性表中的元素型別必須相同 線性表的順序表,是用一組地址連續的儲存單元依次儲存線性表的資料元素 演算法複雜度:取表長與訪問表中的的元素為O(1),插入與刪除的時間複雜度為O(n) 順序表適用於頻繁訪問,只有較少(或不進行)“插入刪除操作” */ #ifndef SQLIST_H #define SQLIST_H #define MAXSIZE 100 //順序表的最大儲存容量 #define INFINITY 65535 //設定為β typedef int ElemType; //順序表的資料型別,自定義 typedef struct { ElemType data[MAXSIZE]; //定義一個順序表,大小為MAXSIZE int len; //順序表的當前長度 }SqList; void InitList(SqList *q); //初始化順序表 void GetElem(SqList *q,int i,ElemType *e); //返回元素,將第i個位置的元素存入*e void GetListLength(SqList *q,int *len); //返回順序表的長度,將長度存入*len void InsertList(SqList *q,int i,ElemType e); //在第i個位置插入e,最壞的情況下i為第一個位置,時間複雜度為O(n) void DeleteList(SqList *q,int i,ElemType *e); //刪除第i個位置的元素,將刪除的元素存入*e,最壞情況i為第一個位置 //時間複雜度為O(n) int LocateElem(SqList *q,ElemType e); //在順序表中查詢元素e是否存在,不存在返回-1,否則返回所在的位置 #endif //SQLIST_H
#include "SqList.h" #include <stdio.h> #include <string.h> void InitList(SqList *q) //初始化順序表 { memset(q->data,0,sizeof(ElemType) * MAXSIZE); //初始化順序表的元素為0 q->len = 0; //初始化順序表的當前大小為0 } void GetElem(SqList *q,int i,ElemType *e) //獲取第i個位置的元素(下標值從零開始,i個位置的元素在表中位置為i-1) { if(i > 0 && i <= q->len) //如果i存在於順序表中 *e = q->data[i - 1]; //返回第i個位置的元素 else *e = INFINITY; //返回β值 } void InsertList(SqList *q,int i,ElemType e) //在順序表的第i個位置插入元素e { if(i > MAXSIZE || i <= 0) { printf("超出範圍,元素插入失敗\n"); return; } for(int j = q->len - 1;j >= i - 1;--j)//將i個位置與i之後的所有元素向後移一位(下標值從零開始i - 1) q->data[j + 1] = q->data[j]; q->data[i - 1] = e; //將元素插入到順序表中,下標值從零開始 ++q->len; //增加當前順序表的長度值 } void DeleteList(SqList *q,int i,ElemType *e) //將順序表中第i個位置的元素刪除,將刪除的元素存入*e { if(i <= 0 && i > q->len) { printf("超出範圍,元素刪除失敗\n"); *e = INFINITY; //返回β值 return; } *e = q->data[i - 1]; for(int j = i - 1;j < q->len - 1;++j) //第i個位置之後的所有元素向後移 q->data[j] = q->data[j + 1]; --q->len; //當前的順序表長度減1 } int LocateElem(SqList *q,ElemType e) //在順序表中查詢元素e,如果找到返回位置,否則返回-1 { for(int i = 0;i < q->len;++i) { if(q->data[i] == e) return i + 1; //下標從0開始,所以要加上1 } return -1; }
#include "SqList.h" #include <stdio.h> int main() { SqList q; InitList(&q); //初始化順序表 int element; int i = 1; //插入的位置 printf("請輸入要插入順序表中的內容:(CTRL + Z)結束\n"); while((scanf("%d",&element)) != EOF) { InsertList(&q,i,element); ++i; } i = 2; //第順序表的第2個位置插入元素 fflush(stdin); //清空緩衝區,確保輸入正確 printf("請輸入要在第2個位置插入的元素\n"); scanf("%d",&element); InsertList(&q,i,element); printf("順序表的內容為:\n"); for(int j = 0;j < q.len;++j) printf("%d ",q.data[j]); printf("\n"); int e; //用於存入被刪除的元素 printf("請輸入要刪除的元素的位置\n"); fflush(stdin); scanf("%d",&i); DeleteList(&q,i,&e); printf("被刪除的元素為:%d\n",e); printf("順序表的內容為:\n"); for(int j = 0;j < q.len;++j) printf("%d ",q.data[j]); printf("\n"); printf("請輸入要在表中查詢的元素:\n"); fflush(stdin); scanf("%d",&element); if((i = LocateElem(&q,element)) == -1) printf("順序表中不存在元素:%d\n",element); else printf("在順序表的第%d個位置找到元素:%d\n",i,element); return 0; }