順序表的兩次實(shí)現(xiàn)

順序表:內(nèi)存中的一塊連續(xù)區(qū)域,緊密排列了若干個(gè)相同類型的數(shù)據(jù)。

故,必須事先知道元素有多少個(gè),不然就無法開出合適的內(nèi)存區(qū)域。

對(duì)于線性表的"."and"->"

在c語言中,->是指針操作符,.是結(jié)構(gòu)操作符,如果L是一個(gè)結(jié)構(gòu)實(shí)例的指針,用->,如果是一個(gè)結(jié)構(gòu)的實(shí)例,用.

L為線性表時(shí),調(diào)用*L表示線性表的第一個(gè)元素,而調(diào)用&L表示線性表的首地址

類型名稱:線性表(List)

數(shù)據(jù)對(duì)象集:線性表是 n (≥0)個(gè)元素構(gòu)成的有序序列( a1, a2, ...,an ) 線性表基本操作主要有:

1、List MakeEmpty():初始化一個(gè)空線性表L;

2、ElementType FindKth( int K, List L ):根據(jù)位序K,返回相應(yīng)元素 ;

3、int Find( ElementType X, List L ):在線性表L中查找X的第一次出現(xiàn)位置;

4、void Insert( ElementType X, int i, List L):在位序i前插入一個(gè)新元素X;

5、void Delete( int? i, List L ):刪除指定位序i的元素;

6、int Length( List L ):返回線性表L的長(zhǎng)度n。


```

#include<malloc.h>

#include<stdio.h>

#include<stdlib.h>

typedef struct LNode *List;

typedef int ElementType;

typedef 100 MAXSIZE;

struct LNode{

? ? ElementType Data[MAXSIZE];

? ? int Last;

};

struct LNode L; //L.Data[i]

List PtrL; //PtrL->Data[i]

/*

**函數(shù)名: List MakeEmpty();

**作? 用: 初始化一個(gè)空線性表L;

**形? 參: 無;

**返回值: PtrL;

*/

List MakeEmpty(void) //初始化空間

{

? ? List PtrL;

? ? PtrL=(List)malloc(sizeof(struct LNode));//void *表示未確定類型的指針。可強(qiáng)轉(zhuǎn)為任何其他類型的的指針。

? ? PtrL->Last=-1;

? ? return PtrL;

}

/*

**函數(shù)名: int Find(ElementType K,List PtrL);

**作? 用: 在線性表L中查找X的第一次出現(xiàn)位置

**形? 參: int K, List PtrL;

**返回值: 位置i;

*/

int Find(ElementType K,List PtrL) //查找

{

? ? int i=0

? ? while(i<=PtrL->Last && PtrL->Data[i]!=K);

? ? i++;

? ? if(i>PtrL->Last) return -1

? ? else return i;

}

/*

**函數(shù)名:ElementType FindKth( int K, List L );

**作? 用: 根據(jù)位序K,返回相應(yīng)元素;

**形? 參: int K,List PtrL;

**返回值: PtrL->Data[K]

*/

ElementType FindKth( int K, List PtrL)

{

? ? while(K<=PtrL->Last && K>=0);

? ? ? ? return PtrL->Data[K];

}

/*

**函數(shù)名: void Insert(ElementType K,int i,List PtrL);

**作? 用: 根據(jù)位置i來插入?yún)?shù)K;

**形? 參: ElementType K,int i,List Ptrl;

**返回值: PtrL;

*/

void Insert(ElementType K,int i,List Ptrl) ? //插入

{

? if(PtrL->Last==MAXSIZE-1){

? ? ? ? printf("線性表滿");

? ? ? ? return;

? ? }

? ? if(i<1||i>Ptrl->Last+2){

? ? ? ? printf("插入位置不合法");

? ? ? ? return;

? ? }

? ? for(j=PtrL->Last;j>i-1;j--){

? ? ? PtrL->Data[j+1]=PtrL->Data[j]

? ? }

? ? PtrL->Data[i+1]=K;

? ? PtrL->Last++;

}

/*

**函數(shù)名: void Delete( int? i, List PtrL )

**作? 用: 刪除指定位序i的元素;

**形? 參: int? i, List PtrL

**返回值:

*/

void Delete( int? i, List PtrL)

{

? ? int j;

? ? if(i>1 || i<=PtrL->Last+1){

? ? ? ? for(j=i;j<=PtrL->Last;j++){

? ? ? ? ? ? PtrL->Data[j-1]=PtrL->Data[j];

? ? ? ? }

? ? ? ? PtrL->Last--;

? ? }else{

? ? ? ? return;

? ? }


}

/*

**函數(shù)名: int Length( List L );

**作? 用: 返回線性表L的長(zhǎng)度n;

**形? 參: List PtrL

**返回值:

*/

int Length(List PtrL){

? ? //return sizeof(PtrL)/ElementType;

? ? return PtrL->Last+1;

}

```

<pre>

ss

</pre>

第二種是我剛寫的

不多說,直接上code

```

#include<stdio.h>

#include<stdlib.h>

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define listincreament 10 //存儲(chǔ)空間分配增量

typedef struct{

int *elem; //存儲(chǔ)空間基址 (末尾)

int length;//當(dāng)前長(zhǎng)度

int listsize;// 當(dāng)前分配的存儲(chǔ)容量

} SqList;

//構(gòu)造一個(gè)空的線性表(初始化)

int InitList_Sq(SqList *L)

{

//動(dòng)態(tài)分配空間

L->elem=(int *)malloc(80*sizeof(int));

//存儲(chǔ)分配失敗

if(!L->elem)

exit(OVERFLOW);

//存儲(chǔ)分配成功

//初始化長(zhǎng)度為零

L->length=0;

//存儲(chǔ)的初始容量為初始分配空間

L->listsize=80;

return OK;

}

//n為要插入的位置

int Input_Sq(SqList *L,int n)

{

int i ,*newbase;

if(n<0)

return ERROR;

if(n>L->listsize)

{

newbase=(int *)malloc(listincreament*sizeof(int));

if(!newbase){

exit(OVERFLOW);

}

L->elem=newbase;

L->length+=listincreament;

}

printf("請(qǐng)輸入元素:\n");

for(i=0;i<n;i++)

{

scanf("%d",&L->elem[i]);

L->length++;

}

return OK;

}

//i為位置,并非下標(biāo),e為要插入的新元素

int ListInsert_Sq(SqList *L,int i,int e){

//i需要滿足1<=i<=ListLength_Sq(L)+1

int *newbase;

int *p;

int *q;//插入的位置

int j;

//判斷輸入

if(i<1||i>L->length+1)

return ERROR;

//判斷線性表是否已滿

if(L->length>=L->listsize)//滿,(魯棒性)(擴(kuò)展)是否動(dòng)態(tài)增加空間?

{

/*newbase=(int *)realloc((L->listsize+listincreament)*sizeof(int));

if(!newbase)

exit(OVERFLOW);//分配失敗

*/

for(j=0;j<L->length;j++)

{

newbase[j]=L->elem[j];

}

L->elem=newbase;//新基址

L->length+=listincreament;//增加存儲(chǔ)容量

}

q=&(L->elem[i-1]);

for(p=&(L->elem[L->length+1]);p>=q;p--)//元素后移

*(p+1)=*p;

*q=e; //插入

L->length+=1;//表長(zhǎng)加1

return L->length;//返回表長(zhǎng)

}

int Output_Sq(SqList *L,int i)

{

int j;

printf("更新后的線性表為:\n");

for(j=0;j<i;j++)

printf("%d\t",L->elem[j]);

return OK;

}

//在順序線性表刪除第i個(gè)元素,用e返回其值

int Delete_Sq(SqList *L,int i,int e)

{

int *q;

//先檢查i的合法性

if(i<1||i>L->length)

return ERROR;

e=L->elem[i-1];//被刪除的元素賦給e,之后用作返回

int *p=&L->elem[i-1]; //指針p為被刪除元素的位置

for(q=p+1;q<=p+(L->length);q++)

*(q-1)=*q;

L->length-=1;

return OK;

}

int main(void)

{

SqList MyL;

char a,yn;

a='Y';

int k,data,position,*e;

InitList_Sq(&MyL);

printf("請(qǐng)輸入元素個(gè)數(shù):");

scanf("%d",&k);

Input_Sq(&MyL,k);

Output_Sq(&MyL,k);

while(a=='Y')

{

printf("\n請(qǐng)輸入要插入的元素:");

scanf("%d",&data);

printf("\n請(qǐng)輸入要插入的位置:");

scanf("%d",&position);

ListInsert_Sq(&MyL,position,data);

//printf(&MyL.length);

Output_Sq(&MyL,k+1);

printf("\n請(qǐng)輸入要?jiǎng)h除的元素的位置:");

scanf("%d",&position);

Delete_Sq(&MyL,position,e);

Output_Sq(&MyL,k);

printf("\n請(qǐng)問是否繼續(xù)(Y or N)?:");

getchar();

scanf("%c",&a);

}

system("pause");

return OK;

}

```

效果如下


?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,595評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,814評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,224評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,444評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,988評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,804評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,998評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評(píng)論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,237評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評(píng)論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,706評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,993評(píng)論 2 374