如何在C 中建立乙個順序表

2022-10-04 04:39:10 字數 4157 閱讀 4372

準備資料

複製** **如下:

#define maxlen 100 //定義順序表的最大長度

struct data

;struct sltype //定義順序表結構

; 定義了順序表的最大長度maxlen、順序表資料元素的型別data以及順序表的資料結構sltype。

在資料結構sltype中,listen為順序表已存結點的數量,也就是當前順序表的長度,listdata是乙個結構陣列,用來存放各個資料結點。

我們認為該順序表是乙個班級學生的記錄。其中,key為學號,name為學生的名稱,age為年齡。

因為陣列都是從下標0開始的,為了使用方便,我們從下標1開始記錄資料結點,下標0的位置不可用。

初始化順序表

在使用順序表之前,首先建立乙個空的順序表,也就是初始化順序表。這裡,在程式中只需設定順序表的結點數量listlen為0即可。這樣,後面需要新增的資料元素將從順序表的第乙個位置儲存。

示例**:

複製** **如下:

void slinit(sltype * sl) //初始化順序表

計算線性表的長度計算線性表的長度也就是計算線性表中結點的個數,由於我們在sltype中定義了listlen來表示結點的數量,所以我們只需要獲得這個變數的值即可。

複製** **如下:

int sllenght(sltype *sl)

插入結點插入節點就是**性表l的第i個位置上插入乙個新的結點,使其後的結點編號依次加1。

這時,插入乙個新節點之後,線性表l的長度將變為n+1。插入結點操作的難點在於隨後的每個結點資料都要向後移動,計算機比較大,示例**如下:

複製** **如下:

int slinsert(sltype *sl,int n,data data)

if(n<1||n>sl->listlen) //插入結點的序號不合法

for(i=sl->listlen;i>=n;i--) //將順序表中的資料向後移動

sl->listdata[n]=data;

sl->listlen++;

return 1;

}在程式中首先判斷順序表結點數量時候已超過最大數量,以及插入點的序號是否正確。前面條件都瞞住以後,便將順序表中的資料向後移動,同時插入結點,並更新結點數量listlen。

追加結點

追加結點就是在順序表的尾部插入結點,因此不必進行大量資料的移動,**實現與插入結點相比就要簡單的多。

複製** **如下:

int sladd(sltype * sl,data data)

sl->listdata[++sl->listlen]=data;

return 1;

}刪除結點刪除結點就是刪除線性表l中的第i個結點,使得其後的所有節點編號依次減1.這是,刪除乙個結點之後,線性表l的長度將變為n-1。刪除結點和插入結點類似,都需要進行大量資料的移動。

複製** **如下:

int sldelete(sltype *sl,int n) //刪除順序表中的資料元素

for(i=n;ilistlen;i++)//將順序表中的資料向前移動

sl->listlen--;   //順序表元素數量減1

return 1;    //成功刪除返回1

} 查詢結點查詢節點就是**性表l中查詢值為x的結點,並返回該節點**性表l中的位置。如果**性表中沒有找到值為x的結點,則返回乙個錯誤標誌。

根據x的型別不同,查詢結點可以分為:

按照序號查詢結點

對於乙個順序表,序號就是資料元素在陣列中的位置,也就是陣列的下標標號。按照序號查詢結點是順序表查詢結點最常用的方法,這是因為順序表的儲存本身就是乙個陣列,示例**如下:

複製** **如下:

data * slfindbynum(sltype *sl,int n)//根據呼號返回資料元素

return &(sl->listdata[n]);

} 按照關鍵字查詢結點關鍵字可以是資料元素中的任意一項。

這裡以key關鍵字為例進行介紹,例如,可以通過key查詢學生的資訊。示例**如下:

複製** **如下:

int slfindbycont(sltype * sl,char *key)//按關鍵字查詢結點

} return 0;      //在整個表中都沒有找到,返回0

} 顯示所有的結點示例**如下:

複製** **如下:

void slall(sltype *sl)

} 順序表操作完整示例:

基本上就是把上面的函式放到一塊,集中展示了一下功能,**有些長,請耐心閱讀^.^

複製** **如下:

#include

#include

using namespace std;

#define maxlen 100 //定義順序表的最大長度

/**************順序表的定義部分*****************/

struct data

;struct sltype //定義順序表結構

; /************順序表的初始化函式*****************/

void slinit(sltype * sl) //初始化順序表

/***********計算線性表的長度*******************/

int sllenght(sltype *sl)

/*********插入結點*******************************/

int slinsert(sltype *sl,int n,data data)

if(n<1||n>sl->listlen) //插入結點的序號不合法

for(i=sl->listlen;i>=n;i--) //將順序表中的資料向後移動

sl->listdata[n]=data;

sl->listlen++;

return 1;     //成功插入,返回1

}/***********************追加結點*************************/

int sladd(sltype * sl,data data)

sl->listdata[++sl->listlen]=data;

return 1;

}/***********************刪除結點*************************/

int sldelete(sltype *sl,int n) //刪除順序表中的資料元素

for(i=n;ilistlen;i++)//將順序表中的資料向前移動

sl->listlen--;   //順序表元素數量減1

return 1;&n程式設計客棧bsp;   //成功刪除返回1

} /*******************按照序號查詢結點********************/

data * slfindbynum(sltype *sl,int n)//根據序號返回資料元素

return &(sl->listdata[n]);

} /*******************按照關鍵字查詢結點********************/

data *slfindbycont(sltype * sl,string name)//按關鍵字查詢結點

} return 0;      //在整個表中都沒有找到,返回0

} /*******************顯示所有的結點********************/

void slall(sltype *sl)

} int main()

}else

}while(1);

cout

cout>i;

pdata=slfindbynum(&sl,i);//按序號查詢結點

if(pdata)

cout>name;

pdata=slfindbycont(&sl,name);

if(pdata)

cout>i;

if(sldelete(&sl,i))

cout>i;

cout>data.key>>data.name>>data.age;

if(slinsert(&sl,i,data))

return 0;

}執行介面:

本文標題: 如何在c++中建立乙個順序表

本文位址:

如何在ORACLE中建立乙個自增字段?

2007 05 18 17 45 不可以,只能通過建立系列來實現 oracle sequence的簡單介紹 在oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。1 create sequence 你首先要有create sequence或者cr...

如何在 OpenCart 中自己建立乙個新的語言包

轉殖乙個已有的語言包 比如把catalog language en gb admin language en gb轉殖成 catalog language zh chs admin language zh chs開始翻譯吧 略資料庫操作 待補全建立乙個語言圖示 待補全待補全 檢視效果 在 syste...

如何在Kafka上建立乙個Topic

bin kafka topics.sh zookeeper 192.168.2.225 2183 config mobile mq create topic test.example replication factor 2 partitions 24 topic指定topic name parti...