數據結構之線性表的順序存儲結構 C語言版

前言

新人屬自動化專業的,最近一學期學了數據庫基礎和UML,深感軟件的重要性,也知道了數據結構的重要性,真後悔當初沒有學好數據結構,這幾天又打算重拾數據結構,去圖書館借來了程傑老師的《大話數據結構》這本書,再此要感謝程傑老師,發誓要將數據結構進行到底。本片文章將程傑老師書上的代碼做了一些修改和總結,不再是那些零散的代碼,而是把順序表作爲一個整體來操作

摘要

順序表在C語言中可以用一維數組來表示,它的數據元素的類型必然相同。
數組的長度和順序表的長度是有區分的,前者一般是事先設定好,不再變化的,而後者一般是變化的,在任意時刻,線性表的長度應該小於等於數組長度
順序表表的優點是可以快速的讀取表中任意元素,缺點是插入和刪除需要移動大量元素,耗費時間,不是很方便

內容佈局

這篇文章中用C語言實現了順序表的操作,其中有:
1.初始化操作
2.添加元素操作(添加-1時,結束)
3.查找操作
4.插入操作
5.刪除操作
6.置空表操作

代碼

以下爲順序表操作的代碼

//線性表的順序表實現
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0

#define MAXSIZE 20/*存儲空間分配初始量*/
typedef int Status;/*Status是函數的類型,其值是函數結果代碼,如OK等*/
typedef int ElemType;/*ElemType類型視情況而定,這裏假設爲int*/

typedef struct
{
	ElemType data[MAXSIZE];/*數組,存儲數據元素*/
	int length;/*線性表當前長度*/
}SqList;

Status InitList(SqList *L);//初始化順序線性表
Status ListEmpty(SqList L);//初始條件:順序表L已經存在,操作結果:L爲空,返回OK,否則返回ERROR
Status ClearList(SqList *L);//初始條件:L已經存在,操作結果:將L置爲空表
Status ListLength(SqList L);//初始條件:L已經存在,操作結果:返回數據個數
Status GetElem(SqList L,int i,ElemType *e);//獲得元素操作
Status ListInsert(SqList *L,int i,ElemType e);//插入
Status ListDelete(SqList *L,int i,ElemType *e);//刪除
Status ListDisplay(SqList L);//輸出

int main()
{
	SqList L;
	ElemType e;
	Status i;
	int j=0,n=1,x=0;
	printf("*****順序表的操作*****\n");
	InitList(&L);
	printf("初始化後順序表的長度爲:%d\n",L.length);
	while(n!=6)
	{
		printf("*1.添加*2.插入*3.查找*4.刪除*5.置空*6.退出\n");
		scanf("%d",&n);
		switch(n)
		{
		case 1:
			printf("請輸入數據\n");
			for(int i=1;x!=-1;i++)
			{
				scanf("%d",&x);
				ListInsert(&L,i,x);
			}
			printf("在L的表尾插入的數據爲:\n");
			ListDisplay(L);
			break;
		case 2:
			printf("請選擇在第幾個元素前插入:\n");
			scanf("%d",&j);
			printf("請選擇插入的數據:\n");
			scanf("%d",&x);
			i=ListInsert(&L,j,x);
			if(i==ERROR)
				printf("插入失敗\n");
			else
				printf("插入成功\n");
			printf("操作之後的順序表:\n");
			ListDisplay(L);
			break;
		case 3:
			printf("您想查找第幾個元素:\n");
			scanf("%d",&x);
			i=GetElem(L,x,&e);
			if(i==ERROR)
				printf("查找失敗\n");
			else
				printf("第%d個元素的值爲:%d\n",x,e);
			break;
		case 4:
			printf("您想刪除第幾個元素:\n");
			scanf("%d",&x);
			i=ListDelete(&L,x,&e);
			if(i==ERROR)
				printf("插入失敗\n");
			else
				printf("刪除第%d個元素值爲:%d\n",x,e);
			printf("操作之後的順序表爲:\n");
			ListDisplay(L);
			break;
		case 5:
			ClearList(&L);
			break;
		case 6:
			break;
		}
	}
	return 0;
}

Status InitList(SqList *L)//初始化順序線性表
{
	L->length=0;
	return OK;
}

Status ListEmpty(SqList L)//初始條件:順序表L已經存在,操作結果:L爲空,返回TRUE,否則返回FALSE
{
	if(L.length==0)
		return OK;
	else
		return ERROR;
}

Status ClearList(SqList *L)//初始條件:L已經存在,操作結果:將L置爲空表
{
	L->length=0;
	return OK;
}

Status ListLength(SqList L)//初始條件:L已經存在,操作結果:返回數據個數
{
	return L.length;
}

Status GetElem(SqList L,int i,ElemType *e)//獲得元素操作,i爲元素下標,e爲i下標下的值
{
	if(L.length==0||i<1||i>L.length)
		return ERROR;
	*e=L.data[i-1];
	return OK;
}
/*	如果插入位置不合理,拋出異常
	從最後一個元素開始向前遍歷到第i個位置,分別向後移動一位
	將要插入元素填入i處
	表長加一	
	在L中第i個位置前插入新的元素e,L的長度加1	*/
Status ListInsert(SqList *L,int i,ElemType e)//插入
{
	int k;
	if(L->length==MAXSIZE)
		return ERROR;
	if(i<1||i>L->length+1)
		return ERROR;
	if (i<=L->length)
	{
		for(k=L->length-1;k>=i-1;k--)
			L->data[k+1]=L->data[k];
	}
	if(e!=-1)//-1時停止插入
	{
		L->data[i-1]=e;
		L->length++;
	}
	return OK;
}

/*	如果刪除位置不合理,拋出異常
	取出刪除元素
	從刪除元素位置開始遍歷到最後一個元素位置,將他們前移一個位置
	表長減1
	操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1	*/
Status ListDelete(SqList *L,int i,ElemType *e) 
{
	int k;
	if(L->length==0||i<1||i>L->length)
		return ERROR;
	*e=L->data[i-1];
	if(i<L->length)
	{
		for(k=i;k<L->length;k++)
			L->data[k-1]=L->data[k];
	}
	L->length--;
	return OK;
}

/* 操作結果:依次對L的每個數據元素輸出 */
Status ListDisplay(SqList L)
{
	int i;
	for(i=0;i<L.length;i++)
		printf("%d ",L.data[i]);
	printf("\n");
	return OK;
}

運行結果

順序表的操作結果

後記

今天的內容就是順序表的基本操作及其內容,喜歡我的多多支持哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章