資料結構—順序表基本操作(c語言程式碼)
阿新 • • 發佈:2019-02-13
順序表
計算機內部儲存一張線性表是用一組連續地址記憶體單元,這種儲存結構即為順序儲存結構,這種結構下的線性表叫順序表。
順序表有兩種定義方法:
1.靜態定義
2.動態生成
順序表是最簡單的一種線性儲存結構,優點:構造簡單,操作方便,通過順序表的首地址(或陣列名)可直接對錶進行隨機存取
缺點:可能浪費儲存空間,插入或者刪除時候需要對後邊一系列的資料進行操作,效率低
下面舉兩個例項並附上c語言程式碼+註釋來理解
靜態順序表
動態順序表/******************************************************************************** 建立一個靜態的順序表存放整數,大小為10,完成以下的操作 1.輸入6個整數,打印出順序表的內容,並顯示錶中剩餘空間的個數 2.在順序表的第三個位置處插入元素0,打印出表中的內容,並顯示空間中剩餘的個數 3.再試圖插入表中第11個位置整數0,程式提示超出範圍 4.刪除表中第6個元素,最後顯示空間中剩餘的個數 *********************************************************************************/ #include <stdio.h> #include <stdlib.h> #define MaxSize 10 /** 函式inserElem的作用:順序表Sqlist第i個位置上插入元素x,並將長度加1 */ /** 向順序表中插入元素 */ /** 引數Sqlist:表首地址 */ /** 引數*len:表的長度 */ /** 引數i:插入元素的位置 */ /** 引數x:待插入的元素值 */ void insertElem(int Sqlist[] , int *len , int i , int x) { int t; if(*len==MaxSize || i<1 || i>*len+1) //長度為len的順序表可插入的位置為1-len+1 其餘的還有表已滿的情況均超出範圍 { printf("非法插入\n"); return; } for(t = *len-1 ; t>=i-1 ; t--) Sqlist[t+1] = Sqlist[t]; //將i-1後的元素順序後移一個元素的位置 Sqlist[i-1] = x; //插入元素 *len = *len+1; //表長加1 } /** 函式inserElem的作用:順序表Sqlist第i個位置上插入元素x,並將長度加1 */ /** 向順序表中刪除元素 */ /** 引數Sqlist:表首地址 */ /** 引數*len:表的長度 */ /** 引數i:插入元素的位置 */ void DelElem(int Sqlist[] , int *len , int i) { int j; if(i<1 || i>*len) { printf("非法刪除\n"); return; } for(j =i ; j<=*len-1 ; j++) Sqlist[j-1] = Sqlist[j]; *len = *len-1; } /** 測試函式 根據題目要求 */ int main() { int Sqlist[MaxSize]; int len; int i; for(i = 0 ; i<6 ; i++) { scanf("%d",&Sqlist[i]); } len = 6; for(i= 0 ; i<len ; i++) printf("%d\t",Sqlist[i]); printf("\n剩餘空間為%d\n" , MaxSize - len); insertElem(Sqlist , &len , 3 , 0); //表中第三個位置插入整數0 for(i= 0 ; i<len ; i++) printf("%d\t",Sqlist[i]); printf("\n剩餘空間為%d\n" , MaxSize - len); insertElem(Sqlist , &len , 11 , 0); //表中第11個位置插入0 DelElem(Sqlist , &len , 6); //刪除第六個元素 for(i= 0 ; i<len ; i++) printf("%d\t",Sqlist[i]); printf("\n剩餘空間為%d\n" , MaxSize - len); return 0; }
/******************************************** *動態的建立一個順序表 *初始長度10,向順序表中輸入15個整數,並列印 *再刪除順序表中的第五個元素,打印出結果 ********************************************/ #include<stdio.h> #include<conio.h> #define MaxSize 10 #include<bits/stdc++.h> /* 定義一個結構體Sqlist */ typedef struct{ int *elem; //指向順序表的首地址 int length; //順序表中表的長度(表中元素的個數) int listsize; //順序表儲存空間容量 }Sqlist; /* 通過一個函式initSqlist實現動態的生成一個順序表 初始化一個順序表 */ /* 引數L:Sqlist型別的指標 因為是指標所以可以在函式中直接對順序表進行操作 */ void initSqlist(Sqlist *L){ //呼叫malloc函式動態分配一段空間,並將空間首地址賦給L的elem成員,L->elem指向順序表的首單元 L ->elem = (int *)malloc(MaxSize*sizeof(int)); if(!L ->elem) exit(0); L -> length = 0; //置0表示表空 剛生成 L -> listsize = MaxSize; //置MaxSize 表示空間大小 }//Sqlist型別的變數L就代表了一張順序表 可以靈活操作 L->elem頭地址 L->length長度 L->MaxSize容量 /******************** *向順序表中插入元素 *引數L :Sqlist型別的指標 *引數i:插入元素的位置 *引數item:插入的元素 *********************/ void InsertElem(Sqlist *L, int i, int item){ //向順序表L中的第i個位置插入元素item int *base, *insert_ptr, *p; if(i < 1 || i > L->length+1) exit(0); //非法插入 退出 if(L->length >= L->listsize) { //realloc函式重新追加空間 ******動態順序表的優勢******** 靜態順序表記憶體大小固定不變 動態可以隨時擴充 base = (int *)realloc(L->elem, (L->listsize +10)*sizeof(int)); L->elem = base; //更新記憶體基址 L->listsize = L->listsize + 100; //記憶體空間增大100單元 } insert_ptr = &(L ->elem[i-1]); //insert_ptr為插入位置 for(p = &(L ->elem[L->length-1]); p >= insert_ptr; p--) *(p+1) =* p; //將i-1後的元素順序後移一個元素的位置 * insert_ptr = item; //在第i個位置上插入元素item L->length++; //表長+1 } /******************** *從順序表中刪除元素 *引數L :Sqlist型別的指標 *引數i:刪除元素的位置 *********************/ void DelElem(Sqlist *L, int i) { //從順序表L中刪除第i個元素 int *delitem, *q; if(i < 1 || i > L->length) exit(0); //非法刪除 delitem = &(L->elem[i-1]); //delitem指向第i個元素 q = L->elem + L->length-1; //q指向表尾 for(++delitem; delitem <= q; ++delitem)*(delitem-1) =* delitem; //將第i位置以後的元素依次前移 L->length--; //表長-1 } /******************** *測試函式 *********************/ int main() { Sqlist l; int i; initSqlist(&l); printf("表中資料:"); for(i =0; i<15; i++) InsertElem(&l, i+1, i+1); for(i = 0; i<l.length; i++) printf("%3d",l.elem[i]); printf("\n刪除後的結果:"); DelElem(&l, 5); for(i = 0; i<l.length; i++) printf("%3d",l.elem[i]); getche(); return 0; }