亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言線性表順序表示及實(shí)現(xiàn)

 更新時(shí)間:2022年07月03日 10:23:20   作者:??世紀(jì)末的架構(gòu)師????  
這篇文章主要介紹了C語(yǔ)言線性表順序表示及實(shí)現(xiàn),線性表是最常用且最簡(jiǎn)單的一種數(shù)據(jù)結(jié)構(gòu)。簡(jiǎn)而言之,一個(gè)線性表是n個(gè)數(shù)據(jù)元素的有限序列

線性表是最常用且最簡(jiǎn)單的一種數(shù)據(jù)結(jié)構(gòu)。簡(jiǎn)而言之,一個(gè)線性表是n個(gè)數(shù)據(jù)元素的有限序列

線性表的順序表示指的是用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表的數(shù)據(jù)元素。 實(shí)現(xiàn)工具:dev 順序表示要實(shí)現(xiàn)的功能:

  • 1.構(gòu)造一個(gè)空的線性表
  • 2. 對(duì)線性表進(jìn)行賦值
  • 3. 對(duì)線性表進(jìn)行銷毀
  • 4. 對(duì)線性表進(jìn)行重置
  • 5. 判斷線性表是否為空
  • 6. 獲取線性表的長(zhǎng)度
  • 7. 獲取線性表某一位置對(duì)應(yīng)的元素
  • 8. 在線性表某一位置插入元素
  • 9. 刪除線性表某一位置的元素
  • 10. 求線性表某一元素的前驅(qū)
  • 11. 求線性表某一元素的后繼
  • 12. 打印線性表
  • 13. 退出

準(zhǔn)備工作

1.在dev新建一個(gè)Source File文件即可 File>new>Source File 

實(shí)現(xiàn)線性表

在實(shí)現(xiàn)程序時(shí)導(dǎo)入的頭文件有

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<windows.h>

在這里我調(diào)用windows頭文件是為了在后面的代碼中修改控制臺(tái)的名稱,在實(shí)現(xiàn)線性表的順序結(jié)構(gòu)時(shí)真正用到的只有前三個(gè)頭文件

在寫(xiě)代碼之前先對(duì)一些表示結(jié)果狀態(tài)的字符進(jìn)行預(yù)定義:

//函數(shù)結(jié)果狀態(tài)字符
#define TRUE     1     //代碼中出現(xiàn)TRUE相當(dāng)于出現(xiàn)了1
#define FALSE    0     //出現(xiàn)FALSE相當(dāng)于出現(xiàn)了0
#define OK       1     //出現(xiàn)OK相當(dāng)于出現(xiàn)了1
#define ERROR    0     //出現(xiàn)ERROR相當(dāng)于出現(xiàn)了0
#define INFEASIBLE    -1
#define OVERFLOW      -2 .

typedef int Status;
typedef int ElemType;

在這里使用了typedef定義了Status和ElemType為int類型,也就是說(shuō)之后的代碼當(dāng)中如果出現(xiàn)了Status和ElemType,它們與int作用相同

線性表的動(dòng)態(tài)分配順序存儲(chǔ)結(jié)構(gòu)

#define LIST_INIT_SIZE    100     //線性表存儲(chǔ)空間的初始分配量 
#define LISTINCREMENT     10      //線性表存儲(chǔ)空間的分配增量 

typedef struct{
	ElemType *elem;          //存儲(chǔ)空間的基址
	int length;              //當(dāng)前線性表的長(zhǎng)度
	int listsize;            //當(dāng)前線性表的存儲(chǔ)容量
}SqList;

構(gòu)造一個(gè)空的線性表

//構(gòu)造一個(gè)空的線性表
Status InitList_Sq(SqList &L){
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));      //L.elem為首元素的地址 
	if(!L.elem){            //如果存儲(chǔ)空間分配失敗,L.elem為NULL
	printf("存儲(chǔ)空間分配失敗\n");
	exit(OVERFLOW);
	}
	L.length = 0;            //當(dāng)前線性表為空表,即線性表長(zhǎng)度為0
	L.listsize = LIST_INIT_SIZE;           //給線性表分配初始容量
	printf("一個(gè)空的線性表已經(jīng)構(gòu)建成功\n");      //輸出空線性表構(gòu)建成功的提示消息 
	return OK; 
} 

在構(gòu)造空線性表時(shí)參數(shù)加&符號(hào)表示引用傳遞,確保形參和實(shí)參同時(shí)改變 L.elem為線性表首元素的地址,L.length為當(dāng)前線性表的長(zhǎng)度,L.listsize為順序表當(dāng)前分配空間的大小 我們現(xiàn)在來(lái)簡(jiǎn)單的介紹一下sizeof函數(shù) sizeof函數(shù):獲取數(shù)據(jù)在內(nèi)存中所占用的存儲(chǔ)空間(以字節(jié)為單位來(lái)計(jì)數(shù)) 圖示:

對(duì)線性表進(jìn)行賦值

Status ValueList_Sq(SqList &L){
	int i,j;
	printf("請(qǐng)輸入線性表元素的個(gè)數(shù):");
	scanf("%d",&i);
	if(i > L.listsize)                     //如果當(dāng)要輸入的元素個(gè)數(shù)大于內(nèi)存大小時(shí) 
	{
		while(1)             //一直開(kāi)辟新空間,直到開(kāi)辟的空間大于需要的空間為止
		{
			if(i > L.listsize){
				L.elem = (ElemType *)realloc(L.elem,LISTINCREMENT * sizeof(ElemType));
				L.listsize += LISTINCREMENT;
			}
			else
			break;
		}
	}
	for(j = 0;j < i;j++){
		printf("請(qǐng)輸入第%d個(gè)元素:",j + 1);
	    scanf("%d",&L.elem[j]);
	} 
	L.length = i;          //賦值完成后,修改并保存線性表的長(zhǎng)度 
	printf("賦值成功\n");
	return OK;
}

這里的形參同樣要加&符號(hào)來(lái)確保形參與實(shí)參同時(shí)改變 進(jìn)行線性表賦值操作時(shí)用到了realloc函數(shù),在這里簡(jiǎn)單的介紹一下realloc函數(shù)的作用 realloc()函數(shù):重新分配空間
參數(shù):原空間基址,現(xiàn)需空間大小
返回值:1. 成功:新空間地址(本質(zhì)上是一個(gè)數(shù)值) 2. 失敗:NULL
 當(dāng)我們?cè)谳斎刖€性表元素個(gè)數(shù)大于構(gòu)造空線性表給線性表分配初始容量時(shí),要一直開(kāi)辟新空間,直到開(kāi)辟的空間大于需要的空間為止

對(duì)線性表進(jìn)行銷毀

Status DistoryList_Sq(SqList &L){
	if(!L.elem){ 
	  printf("您還未建立線性表,請(qǐng)先建立線性表\n");
	  return ERROR; 
	} 
	free(L.elem);            //使用free函數(shù),將之前動(dòng)態(tài)分配的內(nèi)存還給系統(tǒng) 
	L.elem = NULL;           //重置elem的值為Null 
	L.length = 0;            //將線性表的元素個(gè)數(shù)重置為0
	L.listsize = 0;          //將線性表的存儲(chǔ)容量重置為0 
	printf("線性表已經(jīng)銷毀\n"); 
	return OK;
}

在銷毀線性表時(shí),首先先對(duì)線性表是否存在進(jìn)行判斷,如果線性表不存在,L.elem為NULL,所以此時(shí)!L.elem為true,執(zhí)行后面的return ERROR; L.elem中存儲(chǔ)的是初始化是動(dòng)態(tài)分配內(nèi)存首元素的地址,free函數(shù)的作用就是將之前動(dòng)態(tài)分配的內(nèi)存還給系統(tǒng),但是在調(diào)用free函數(shù)之后,雖然歸還了內(nèi)存,但是L.elem中仍然指向原來(lái)的地址,而這個(gè)地址在歸還內(nèi)存之后程序便無(wú)權(quán)進(jìn)行訪問(wèn),所以此時(shí)L.elem就成了一個(gè)野指針,我們重置L.elem為NULL就是為了防止發(fā)生野指針訪問(wèn)的情況,接著將線性表元素的個(gè)數(shù)L.length和存儲(chǔ)容量L.listsize重置為0

對(duì)線性表進(jìn)行重置

//對(duì)線性表進(jìn)行重置
Status ClearList_Sq(SqList &L){
	if(L.elem){                  //如果線性表存在 
	    L.length = 0;            //將線性表的元素個(gè)數(shù)重置為0
	    printf("線性表已重置\n");
	    return OK;
	}
	else 
	printf("線性表不存在,無(wú)法重置\n");
	return OK;
} 

重置線性表時(shí)仍然先對(duì)線性表是否存在進(jìn)行判斷,如果線性表存在只需將線性表元素個(gè)數(shù)L.length重置為0即可,不需要改變其它變量

判斷線性表是否為空

//判斷線性表是否為空
Status ListEmpty_Sq(SqList L){
	if(L.elem){          //判斷線性表是否為空的前提是線性表存在,當(dāng)首元素地址即L.elem存在時(shí)說(shuō)明線性表存在 
		if(L.length != 0){               //如果線性表中元素為0,即L.length的值為0時(shí)說(shuō)明線性表是空表 
		       printf("線性表不是空表\n");
		       return FALSE;
			}
			else
			   printf("線性表是空表\n");
		return TRUE;
	}
	else
	printf("線性表不存在,無(wú)法判斷\n");
	return OK;
}

判斷線性表是否為空只需要看線性表當(dāng)中的元素個(gè)數(shù)L.length是否為0即可,如果為0,則說(shuō)明線性表是空表;不等于0則說(shuō)明該線性表不為空

獲取線性表的長(zhǎng)度

//獲取線性表的長(zhǎng)度
Status ListLength_Sq(SqList L){
	if(L.elem){              //判斷當(dāng)前線性表存在
		int K;
		K = L.length;        //將線性表的元素個(gè)數(shù)賦值給K
		printf("線性表長(zhǎng)度為%d\n",K);
		return OK;
	}
	else
		printf("線性表不存在,無(wú)法判斷\n");
	return OK;
}

線性表的長(zhǎng)度是由當(dāng)前線性表中的元素個(gè)數(shù)來(lái)體現(xiàn)的,所以獲取線性表的長(zhǎng)度僅需定義一個(gè)int類型變量,并將L.length賦值給K即可

獲取線性表某一位置對(duì)應(yīng)的元素

//獲取線性表某一位置對(duì)應(yīng)的元素
Status GetElem_Sq(SqList L,int index){
	int Num;
	if(index <= 0 || index > L.length){              //如果要獲取元素的位置是否出界 
		printf("請(qǐng)輸入一個(gè)有效的數(shù)字\n");
		return ERROR;
	}
	else
	Num = L.elem[index - 1];
	printf("第%d個(gè)位置的元素為:%d\n",index,Num);
	return OK;
} 

同樣地,獲取線性表某一位置對(duì)應(yīng)的元素時(shí)先判斷要獲取的位置是否合法,和判斷線性表的長(zhǎng)度一樣,只需要將L.elem[index-1]位置的元素賦值給一個(gè)int型變量Num即可(index-1是因?yàn)閿?shù)組元素的下標(biāo)是從0開(kāi)始的)

在線性表某一位置插入元素

//在線性表某一位置插入元素
Status ListInsert_Sq(SqList &L,int i,ElemType e){
	ElemType *newbase;
	int *q,*p; 
	if(i < 1 || i > L.length+1)         //判斷插入位置的index值是否合法
	    return ERROR;
	if(L.length >= L.listsize){         //如果當(dāng)前線性表存儲(chǔ)空間已滿,增加分配
		newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)  {                 //如果存儲(chǔ)空間分配失敗,則執(zhí)行異常退出
			printf("存儲(chǔ)空間分配失敗\n");
			exit(OVERFLOW);
		}
		L.elem = newbase;               //新的存儲(chǔ)空間基址
		L.listsize += LISTINCREMENT;
	}
	q = &(L.elem[i-1]);                 //L.elem[index-1]為數(shù)組中的最后一個(gè)元素,q為要插入的位置 
	for(p = &(L.elem[L.length - 1]);p >= q;--p)
	    *(p+1) = *p;                    //要插入位置以及之后的位置向后移 
	*q = e;                             //將e插入到想要插入的位置 
	++L.length;                         //插入新的元素之后表長(zhǎng)加1 
	printf("元素插入成功\n");
	return OK;
}

在線性表中的某一位置插入一個(gè)元素,同樣要先判斷要插入的位置是否合法,接著就是判斷線性表是否已滿,如果線性表沒(méi)有存儲(chǔ)位置,則需要通過(guò)realloc函數(shù)重新分配一塊空間,要想在某一位置插入一個(gè)元素,首先要將這個(gè)想要插入元素的位置空出來(lái),所以在插入元素時(shí)要先從表尾開(kāi)始到想要插入元素的位置將元素依次向后移動(dòng)一位 realloc函數(shù)如果分配空間成功的話返回的就是新空間的地址,但是本質(zhì)上是一個(gè)數(shù)值,因此就需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,將數(shù)值改成指針類型 

圖示:

在這里要強(qiáng)調(diào)一點(diǎn)這一條語(yǔ)句,為什么不直接將newbase直接賦值給L.elem,要先進(jìn)行判斷是否分配存儲(chǔ)成功?

if(!newbase) { //如果存儲(chǔ)空間分配失敗,則執(zhí)行異常退出

		printf("存儲(chǔ)空間分配失敗\n");
		exit(OVERFLOW);
	}
	L.elem = newbase;

如果分配空間失敗,此時(shí)的newbase的值為NULL,所以此時(shí)L.elem就會(huì)被賦值為NULL,原信息丟失 插入元素后,表長(zhǎng)加一

刪除線性表某一位置的元素

//刪除線性表某一位置的元素
Status DeleteList_Sq(SqList &L,int i){
	int *p,*q;
	if(i < 1 || i > L.length){            //如果要?jiǎng)h除的位置不合法
		printf("請(qǐng)輸入一個(gè)有效數(shù)字\n");
		return ERROR;
	} 
	p = &(L.elem[i - 1]);                 //p為被刪除元素的位置
	q = L.elem + L.length - 1;            //將表尾元素的位置賦值給q
	for(++p;p <= q;p++)
	    *(p - 1) = *p;                    //被刪除的元素之后的元素全部左移 
	--L.length;                           //表長(zhǎng)減1 
	printf("第%d個(gè)元素刪除成功\n",i);
	return OK;
}

L.elem + L.length - 1為表尾元素,刪除元素相比起插入元素要簡(jiǎn)便些,不需要進(jìn)行后移操作,數(shù)據(jù)向前覆蓋,刪除完成后表長(zhǎng)減1即可。如果有需要的話,可以單獨(dú)定義一個(gè)int類型的變量在進(jìn)行刪除操作之前將要?jiǎng)h除的元素賦值給該變量。

求線性表某一元素的前驅(qū)

//求線性表某一元素的前驅(qū)
Status PriorElem_Sq(SqList L,int i){
	int K;
	if(L.elem){          //判斷線性表是否為空的前提是線性表存在,當(dāng)首元素地址即L.elem存在時(shí)說(shuō)明線性表存在
	    if(i <= 1 || i > L.length + 1)              //判斷輸入的i值是否合法 
	        printf("請(qǐng)輸入一個(gè)有效數(shù)字\n");
		K = L.elem[i - 2];        //將第i個(gè)元素的前一個(gè)元素賦值給K
		printf("第%d個(gè)位置的直接前驅(qū)為:%d\n",i,K); 
	}
	else
		printf("線性表不存在,無(wú)法判斷\n");
	return OK;
} 

求前驅(qū)時(shí)除了要判斷線性表是否存在外,只需要將L.elem[i-2]賦給int型變量K即可

求線性表某一元素的后繼

//求線性表某一元素的后繼 
Status NextElem_Sq(SqList L,int i){
	int K;
	if(L.elem){          //判斷線性表是否為空的前提是線性表存在,當(dāng)首元素地址即L.elem存在時(shí)說(shuō)明線性表存在
	    if(i <= 1 || i > L.length - 1)              //判斷輸入的i值是否合法
	        printf("請(qǐng)輸入一個(gè)有效數(shù)字\n");
		K = L.elem[i];        //將第i個(gè)元素的后一個(gè)元素賦值給K
		printf("第%d個(gè)位置的直接后繼為:%d\n",i,K);
	}
	else
		printf("線性表不存在,無(wú)法判斷\n");
	return OK;
} 

求后繼和求前驅(qū)除了在元素位置上有區(qū)別外,其余的思路都一致,在此不多做贅述

打印線性表

//打印線性表
Status PrintList_Sq(SqList L){
	printf("當(dāng)前線性表的元素為:");
	for(int K = 0;K < L.length;K++)      //遍歷當(dāng)前線性表
	    printf("  %d",L.elem[K]);
	printf("\n");                        //換行
	return OK;
} 

運(yùn)行結(jié)果演示:

為了方便演示,在這里線性表一次賦值為1,2,3,4,5

構(gòu)建一個(gè)空線性表

 賦值操作

 判斷此時(shí)的線性表是否為空

 獲取線性表的長(zhǎng)度

 獲取2號(hào)位置的元素

在3號(hào)位置插入520并打印線性表

 刪除3號(hào)位置的520并打印線性表 

 求3號(hào)位置的前驅(qū)和后繼

以上便是線性表順序表示和實(shí)現(xiàn),由于高級(jí)程序設(shè)計(jì)語(yǔ)言中的數(shù)組類型也有隨機(jī)存取的特性,因此,通常用數(shù)組來(lái)描述數(shù)據(jù)結(jié)構(gòu)中的順序存儲(chǔ)結(jié)構(gòu)。在這種結(jié)構(gòu)中,很容易實(shí)現(xiàn)線性表的某些操作,但是需要特別注意的是C語(yǔ)言的數(shù)組下標(biāo)是從“0”開(kāi)始。

源碼

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<windows.h>

//函數(shù)結(jié)果狀態(tài)代碼 
#define TRUE     1     //代碼中出現(xiàn)TRUE相當(dāng)于出現(xiàn)了1
#define FALSE    0     //出現(xiàn)FALSE相當(dāng)于出現(xiàn)了0
#define OK       1     //出現(xiàn)OK相當(dāng)于出現(xiàn)了1
#define ERROR    0     //出現(xiàn)ERROR相當(dāng)于出現(xiàn)了0
#define INFEASIBLE    -1
#define OVERFLOW      -2

typedef int Status;
typedef int ElemType;

#define LIST_INIT_SIZE    100     //線性表存儲(chǔ)空間的初始分配量
#define LISTINCREMENT     10      //線性表存儲(chǔ)空間的分配增量

typedef struct{
	ElemType *elem;          //存儲(chǔ)空間的基址
	int length;              //當(dāng)前線性表的長(zhǎng)度
	int listsize;            //當(dāng)前線性表的存儲(chǔ)容量
}SqList;

//構(gòu)造一個(gè)空的線性表
Status InitList_Sq(SqList &L){
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));      //L.elem為首元素的地址 
	if(!L.elem){            //如果存儲(chǔ)空間分配失敗,L.elem為NULL
	printf("存儲(chǔ)空間分配失敗\n");
	exit(OVERFLOW);
	}
	L.length = 0;            //當(dāng)前線性表為空表,即線性表長(zhǎng)度為0
	L.listsize = LIST_INIT_SIZE;           //給線性表分配初始容量
	printf("一個(gè)空的線性表已經(jīng)構(gòu)建成功\n");      //輸出空線性表構(gòu)建成功的提示消息 
	return OK;
}

//對(duì)線性表進(jìn)行賦值
Status ValueList_Sq(SqList &L){
	int i,j;
	printf("請(qǐng)輸入線性表元素的個(gè)數(shù):");
	scanf("%d",&i);
	if(i > L.listsize)                     //如果當(dāng)要輸入的元素個(gè)數(shù)大于內(nèi)存大小時(shí) 
	{
		while(1)             //一直開(kāi)辟新空間,直到開(kāi)辟的空間大于需要的空間為止
		{
			if(i > L.listsize){
				L.elem = (ElemType *)realloc(L.elem,LISTINCREMENT * sizeof(ElemType));
				L.listsize += LISTINCREMENT;
        /*realloc()函數(shù):重新分配空間
		           參數(shù):原空間基址,現(xiàn)需空間大小
		           返回:1.成功:新空間地址(本質(zhì)上是一個(gè)數(shù)值)
		                 2.失?。篘ull
	    */
			}
			else
			break;
		}
	}
	for(j = 0;j < i;j++){
		printf("請(qǐng)輸入第%d個(gè)元素:",j + 1);
	    scanf("%d",&L.elem[j]);
	} 
	L.length = i;          //賦值完成后,修改并保存線性表的長(zhǎng)度 
	printf("賦值成功\n");
	return OK;
}

//對(duì)線性表進(jìn)行銷毀
Status DistoryList_Sq(SqList &L){
	if(!L.elem){
	  printf("您還未建立線性表,請(qǐng)先建立線性表\n");
	  return ERROR;
	}
	free(L.elem);            //使用free函數(shù),將之前動(dòng)態(tài)分配的內(nèi)存還給系統(tǒng) 
	L.elem = NULL;           //重置elem的值為Null 
	L.length = 0;            //將線性表的元素個(gè)數(shù)重置為0
	L.listsize = 0;          //將線性表的存儲(chǔ)容量重置為0 
	printf("線性表已經(jīng)銷毀\n"); 
	return OK;
}

//對(duì)線性表進(jìn)行重置
Status ClearList_Sq(SqList &L){
	if(L.elem){                  //如果線性表存在 
	    L.length = 0;            //將線性表的元素個(gè)數(shù)重置為0
	    printf("線性表已重置\n");
	    return OK;
	}
	else
	printf("線性表不存在,無(wú)法重置\n");
	return OK;
}

//判斷線性表是否為空
Status ListEmpty_Sq(SqList L){
	if(L.elem){          //判斷線性表是否為空的前提是線性表存在,當(dāng)首元素地址即L.elem存在時(shí)說(shuō)明線性表存在
		if(L.length != 0){               //如果線性表中元素為0,即L.length的值為0時(shí)說(shuō)明線性表是空表
		       printf("線性表不是空表\n");
		       return FALSE; 
			}
			else
			   printf("線性表是空表\n");
		return TRUE;
	}
	else
	printf("線性表不存在,無(wú)法判斷\n");
	return OK; 
}

//獲取線性表的長(zhǎng)度
Status ListLength_Sq(SqList L){
	if(L.elem){              //判斷當(dāng)前線性表存在 
		int K;
		K = L.length;        //將線性表的元素個(gè)數(shù)賦值給K
		printf("線性表長(zhǎng)度為%d\n",K);
		return OK;
	}
	else
		printf("線性表不存在,無(wú)法判斷\n");
	return OK;
}

//獲取線性表某一位置對(duì)應(yīng)的元素
Status GetElem_Sq(SqList L,int index){
	int Num;
	if(index <= 0 || index > L.length){              //如果要獲取元素的位置是否出界 
		printf("請(qǐng)輸入一個(gè)有效的數(shù)字\n");
		return ERROR;
	}
	else
	Num = L.elem[index - 1];
	printf("第%d個(gè)位置的元素為:%d\n",index,Num);
	return OK;
} 

//在線性表某一位置插入元素
Status ListInsert_Sq(SqList &L,int i,ElemType e){
	ElemType *newbase;
	int *q,*p;
	if(i < 1 || i > L.length+1)         //判斷插入位置的index值是否合法
	    return ERROR;
	if(L.length >= L.listsize){         //如果當(dāng)前線性表存儲(chǔ)空間已滿,增加分配
		newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)  {                 //如果存儲(chǔ)空間分配失敗,則執(zhí)行異常退出
			printf("存儲(chǔ)空間分配失敗\n");
			exit(OVERFLOW);
		}
		L.elem = newbase;               //新的存儲(chǔ)空間基址
		L.listsize += LISTINCREMENT; 
	}
	q = &(L.elem[i-1]);                 //L.elem[index-1]為數(shù)組中的最后一個(gè)元素,q為要插入的位置
	for(p = &(L.elem[L.length - 1]);p >= q;--p)
	    *(p+1) = *p;                    //要插入位置以及之后的位置向后移
	*q = e;                             //將e插入到想要插入的位置
	++L.length;                         //插入新的元素之后表長(zhǎng)加1
	printf("元素插入成功\n");
	return OK;
}

//打印線性表
Status PrintList_Sq(SqList L){
	printf("當(dāng)前線性表的元素為:");
	for(int K = 0;K < L.length;K++)      //遍歷當(dāng)前線性表
	    printf("  %d",L.elem[K]);
	printf("\n");                        //換行
	return OK;
} 

//刪除線性表某一位置的元素
Status DeleteList_Sq(SqList &L,int i){
	int *p,*q;
	if(i < 1 || i > L.length){            //如果要?jiǎng)h除的位置不合法
		printf("請(qǐng)輸入一個(gè)有效數(shù)字\n"); 
		return ERROR;
	} 
	p = &(L.elem[i - 1]);                 //p為被刪除元素的位置
	q = L.elem + L.length - 1;            //將表尾元素的位置賦值給q
	for(++p;p <= q;p++)
	    *(p - 1) = *p;                    //被刪除的元素之后的元素全部左移
	--L.length;                           //表長(zhǎng)減1
	printf("第%d個(gè)元素刪除成功\n",i);
	return OK;
}

//求線性表某一元素的前驅(qū)
Status PriorElem_Sq(SqList L,int i){
	int K;
	if(L.elem){          //判斷線性表是否為空的前提是線性表存在,當(dāng)首元素地址即L.elem存在時(shí)說(shuō)明線性表存在
	    if(i <= 1 || i > L.length + 1)              //判斷輸入的i值是否合法 
	        printf("請(qǐng)輸入一個(gè)有效數(shù)字\n");
		K = L.elem[i - 2];        //將第i個(gè)元素的前一個(gè)元素賦值給K
		printf("第%d個(gè)位置的直接前驅(qū)為:%d\n",i,K);
	}
	else
		printf("線性表不存在,無(wú)法判斷\n");
	return OK;
}

//求線性表某一元素的后繼
Status NextElem_Sq(SqList L,int i){
	int K;
	if(L.elem){          //判斷線性表是否為空的前提是線性表存在,當(dāng)首元素地址即L.elem存在時(shí)說(shuō)明線性表存在
	    if(i <= 1 || i > L.length - 1)              //判斷輸入的i值是否合法 
	        printf("請(qǐng)輸入一個(gè)有效數(shù)字\n");
		K = L.elem[i];        //將第i個(gè)元素的后一個(gè)元素賦值給K
		printf("第%d個(gè)位置的直接后繼為:%d\n",i,K);
	}
	else
		printf("線性表不存在,無(wú)法判斷\n");
	return OK;
} 

int main(){
	SetConsoleTitle("Dream_飛翔");
	SqList L;
	int choose,index,e;
	while(1){
		printf("*****************************************\n");
		printf("*                                       *\n");
		printf("*  線性表的順序表示和實(shí)現(xiàn):             *\n");
		printf("*                                       *\n");
		printf("*    1.  構(gòu)造一個(gè)空的線性表             *\n");
		printf("*    2.  對(duì)線性表進(jìn)行賦值               *\n");
		printf("*    3.  對(duì)線性表進(jìn)行銷毀               *\n");
		printf("*    4.  對(duì)線性表進(jìn)行重置               *\n"); 
		printf("*    5.  判斷線性表是否為空             *\n");
		printf("*    6.  獲取線性表的長(zhǎng)度               *\n");
		printf("*    7.  獲取線性表某一位置對(duì)應(yīng)的元素   *\n");
		printf("*    8.  在線性表某一位置插入元素       *\n");
		printf("*    9.  刪除線性表某一位置的元素       *\n");
		printf("*    10. 求線性表某一元素的前驅(qū)         *\n");
		printf("*    11. 求線性表某一元素的后繼         *\n");
		printf("*    12. 打印線性表                     *\n");
		printf("*    13. 退出                           *\n");
		printf("*                                       *\n");
		printf("*****************************************\n");
		printf("請(qǐng)做出您的選擇:");
		scanf("%d",&choose);
		switch(choose){
			case 1:InitList_Sq(L);break;
			case 2:ValueList_Sq(L);break;
			case 3:DistoryList_Sq(L);break;
			case 4:ClearList_Sq(L);break;
			case 5:ListEmpty_Sq(L);break;
			case 6:ListLength_Sq(L);break;
			case 7:{
				printf("請(qǐng)輸入要獲取元素的位置:");
				scanf("%d",&index);
				GetElem_Sq(L,index);
			}
			break;
			case 8:{
				printf("請(qǐng)輸入要插入元素的位置:");
				scanf("%d",&index);
				printf("請(qǐng)輸入要插入的元素:");
				scanf("%d",&e);
				ListInsert_Sq(L,index,e);
			}
			break;
			case 9:{
				printf("請(qǐng)輸入要?jiǎng)h除元素的位置:");
				scanf("%d",&index);
				DeleteList_Sq(L,index);
			}
			break;
			case 10:{
				printf("請(qǐng)輸入想要查找哪一個(gè)元素的前驅(qū):");
				scanf("%d",&index);
				PriorElem_Sq(L,index);
			}
			break;
			case 11:{
				printf("請(qǐng)輸入想要查找哪一個(gè)元素的后繼:");
				scanf("%d",&index);
				NextElem_Sq(L,index);
			}
			break; 
			case 12:PrintList_Sq(L);break;
			case 13:exit(0);
		}
	}
	return 0;
}

到此這篇關(guān)于C語(yǔ)言線性表順序表示及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言線性表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論