資料結構 順序表的基本操作

2021-08-07 19:20:28 字數 4598 閱讀 1962

老規矩先來看一下題目~

本題要求實現順序表元素的增、刪、查詢以及順序表輸出共4個基本操作函式。l是乙個順序表,函式status listinsert_sq(sqlist &l, int pos, elemtype e)是在順序表的pos位置插入乙個元素e(pos應該從1開始),函式status listdelete_sq(sqlist &l, int pos, elemtype &e)是刪除順序表的pos位置的元素並用引用型引數e帶回(pos應該從1開始),函式int listlocate_sq(sqlist l, elemtype e)是查詢元素e在順序表的位次並返回(如有多個取第乙個位置,返回的是位次,從1開始,不存在則返回0),函式void listprint_sq(sqlist l)是輸出順序表元素。實現時需考慮表滿擴容的問題。

status listinsert_sq(sqlist &l, int pos, elemtype e);

status listdelete_sq(sqlist &l, int pos, elemtype &e);

int listlocate_sq(sqlist l, elemtype e);

void listprint_sq(sqlist l);

其中 l 是順序表。 pos 是位置; e 代表元素。當插入與刪除操作中的pos引數非法時,函式返回error,否則返回ok。

//庫函式標頭檔案包含

#include#include#include//函式狀態碼定義

#define true 1

#define false 0

#define ok 1

#define error 0

#define infeasible -1

#define overflow -2

typedef int status;

//順序表的儲存結構定義

#define list_init_size 100

#define listincrement 10

typedef int elemtype; //假設線性表中的元素均為整型

typedef structsqlist; //順序表型別定義

status listinsert_sq(sqlist &l, int pos, elemtype e);

status listdelete_sq(sqlist &l, int pos, elemtype &e);

int listlocate_sq(sqlist l, elemtype e);

void listprint_sq(sqlist l);

//結構初始化與銷毀操作

status initlist_sq(sqlist &l)

int main()

for(int i = 1; i <= 10; ++ i)

listinsert_sq(l, i, i);

int operationnumber; //操作次數

scanf("%d", &operationnumber);

while(operationnumber != 0) else if(operationtype == 2) else if(operationtype == 3) else if(operationtype == 4)

operationnumber--;

}return 0;

}/* 請在這裡填寫答案 */

輸入格式: 第一行輸入乙個整數operationnumber,表示運算元,接下來operationnumber行,每行表示乙個操作資訊(含「操作種類編號 操作內容」)。 編號為1表示插入操作,後面兩個引數表示插入的位置和插入的元素值 編號為2表示刪除操作,後面乙個引數表示刪除的位置 編號為3表示查詢操作,後面乙個引數表示查詢的值 編號為4表示順序表輸出操作 輸出格式: 對於操作2,輸出刪除的元素的值 對於操作3,輸出該元素的位置,如果不存在該元素,輸出「not found」; 對於操作4,順序輸出整個順序表的元素,兩個元素之間用空格隔開,最後乙個元素後面沒有空格。

4

1 1 11

2 23 3

4

1

311 2 3 4 5 6 7 8 9 10

根據題目內容可以看出,這個程式的主函式和一些必要的宣告已經給出,需要我們自行填充的就是

status listinsert_sq(sqlist &l, int pos, elemtype e),

status listdelete_sq(sqlist &l, int pos, elemtype &e),

int listlocate_sq(sqlist l, elemtype e)和void listprint_sq(sqlist l)這四個函式的具體內容。我們挨個來看。

一.status listinsert_sq(sqlist &l, int pos, elemtype e)

這個函式實現的是在l的順序表中的pos位置插入乙個資料e。我們可想而知,在pos位置插入資料e後,pos位置之後的所有元素都要向後移動一位,好在pos這個地方騰出空來放資料e。於是我們開始初步有了構思,就是先用乙個for迴圈,將原先pos位置及之後的元素向後移動一位,然後在pos位置插入資料e就可以大功告成。但是我們也要考慮,當順序表的元素個數也就是l.length的數值已經達到了一開始設定的上限,也就是

#define list_init_size  100

這一行所定義的list_init_size的個數時,我們需要先進行擴容,再進行將各個資料向後移動的操作。不然就會超界。所以要先判斷是否需要擴容。同時,如果給的pos本來就超出了l.ength的限制,就要返回錯誤。因為不存在第pos位。另外一定要注意的一點就是,pos是》=1的,而陣列是從0開始,所以第pos個數在陣列中的下標為【pos - 1】.

**實現就是:

status listinsert_sq(sqlist &l, int pos, elemtype e)

elemtype *p,*q;

p = &(l.elem[pos - 1]);//將原來pos位置元素的位址分配給指標p

for(q = &(l.elem[l.length - 1]);q >= p;--q)

//將原來順序表最後乙個位置資料的位址分配給q,然後從後往前依次將資料向後移動一位

*p = e;//將資料e放到pos位置

++l.length;//順序表的長度要加一

return ok;

}else

return overflow;

}

二.status listdelete_sq(sqlist &l, int pos, elemtype &e)

好啦最難的乙個函式已經解決掉啦~剩下的都簡單多啦~

這個函式實現的是刪掉順序表的第pos位的元素。這讓我們不禁想到了第乙個的增加的效果,但是刪除比增加簡單得多,不需要考慮擴容的問題。所以只需要將pos位置以後的元素挨個向前移動一位就大功告成啦。但是注意,因為要以引用的形式返回資料e,所以要先給e賦值,再進行刪除操作。同樣也要注意,pos是》=1的,而陣列是從0開始,所以第pos個數在陣列中的下標為【pos - 1】。

**實現如下:

status listdelete_sq(sqlist &l, int pos, elemtype &e)

//將pos位置以後的元素依次向前移動一位

l.length = l.length - 1;//l的長度要減一

}else

return overflow;

}

三.int listlocate_sq(sqlist l, elemtype e)

這個函式實現的是查詢功能,如果存在該資料,則返回是第幾個,如果存在多個,則返回第乙個這個數的位置數,如果不存在,返回not found,非常容易實現,乙個for迴圈就可以實現。我們先定義乙個數a,用它來表示位置數。需要注意的是,位置數是從1開始,而順序表是從0開始。第2個數在順序表中的下標為1。所以在返回時要對a進行+1操作。另外,由於存在找不到的情況,可以先將a賦初值,如果a的值不是初值了,就說明存在,如果a仍然是初值,則說明存在這個數。

**實現如下:

int listlocate_sq(sqlist l, elemtype e)

}//for迴圈進行查詢

if(a >= 0&&a <= l.length -1)

return a + 1;//如果a的值滿足要求,則返回a

else

return error;//如果a不滿足,則返回錯誤。

}

四.void listprint_sq(sqlist l)

這個函式實現的是順序表的輸出。只需要注意最後乙個數後面沒有空格就行。

**實現:

void listprint_sq(sqlist l)

printf("%d",l.elem[l.length -1]);

}

資料結構 順序表的基本操作

計算機中線性表的存放結構主要有兩種 順序儲存結構和鏈式儲存結構。採用前者存放方式的線性表是順序表,採用後者的就是我們平時所說的鍊錶 線性鍊錶 這裡先對順序表的一些基本操作進行歸納和總結,鍊錶的將在後面的文章中歸納總結。順序表的表示,一般都是借助一維陣列。c 語言定義其結構如下 const int m...

資料結構 順序表的基本操作

main include include define true 1 define error 0 define ok 1 define false 0 define overflow 2 typedef int status typedef int elemtype define list ini...

資料結構 順序表的基本操作

順序表 順序表是用一段實體地址連續的儲存單元依次儲存資料元素的線性結構,一般情況下採用陣列儲存。在陣列上完成資料的增刪查改。順序表一般可以分為 順序表的元素型別 int public class myarraylist 增 重點 尾插 public void pushback int element...