前言
新人屬自動化專業的,最近一學期學了數據庫基礎和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;
}
運行結果
後記
今天的內容就是順序表的基本操作及其內容,喜歡我的多多支持哦~