線性表 順序存儲 C語言實作
關于線性表8個基本操作的c語言實作.
[注意]
- 順序表用數組表示 線性表位序從1開始,數組元素下标從0開始.
- 順序表插入删除 判斷插入,删除位置是否合法的表示方法.
#include<stdio.h>
//SqList 順序表
#define MaxSize 50
//定義順序表
typedef struct{
int data[MaxSize]; //順序表元素
int length; //順序表目前長度
}SqList;
//1.順序表删除 删除順序表第i個位置的元素,傳回值是e
bool ListDelete(SqList *L,int i,int *e){
//1)删除前----判斷插入位置是否合法
if(i<1 && i>L->length){ //j将順序表存儲在數組中
return false;
}
//2)删除中----找到要删除元素的位置并将值賦給e
*e = L->data[i-1];
//3)删除後----i位置後的元素前移
for(int j = i;j<L->length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
return true;
}
//2.初始化
int InitSqList(SqList *p){
(*p).length = 0;
return 1;
}
//3.插入 線性表 位置 資料
bool ListInsert(SqList *p,int i,int e){
//1)插入前 --檢查插入位置是否合法
if(i>(*p).length+1 || i<1)
return false;
if((*p).length>MaxSize)
return false;
//2)插入中 -- i位置後元素後移 插入位置 線性表長度+1
for(int j=(p->length);j>=i;j--){
(*p).data[j]=(*p).data[j-1];
}
p->data[i-1] = e;
p->length++;
return true;
}
//4.判斷已存在的線性表是否為空 通過長度
int ListEmpty(SqList L){
if(L.length==0){
return 1;
}else{
return 0;
}
}
//5.清空線性表
int ClearList(SqList *L){
L->length=0;
return 1;
}
//6.線性表周遊
int ListTraverse(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf(" %d ",L.data[i]);
printf("\n");
return 1;
}
//7.擷取指定位置元素
int GetElem(SqList L,int i, int *e){
//1)查找位置是否合法
if(i>L.length ||i<1)
return 0;
//2)進行查找
*e=L.data[i-1];
return 1;
}
//8.擷取元素所在的位序 傳回0查找失敗
int LocateElem(SqList L,int e){
int i;
if(L.length=0)
return 0;
for(i=0;i<L.length;i++){
if(L.data[i]=e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
int main(){
SqList L,Lb;
int i,j,k;
int e;
i=InitSqList(&L);
if(i=1){
printf("初始化成功\n");
printf("初始化線性表長度:%d\n",L.length);
}
for(j=1;j<=5;j++){
ListInsert(&L,1,j);
}
printf("\n L依次插入1-5,結果為:\n");
for(i=0;i<5;i++){
printf(" %d ",L.data[i]);
}
printf("此時長度為:%d\n",L.length);
i=ListEmpty(L);
if(i=1){
printf("線性表為空\n");
}else{
printf("線性表不為空\n");
}
i=ClearList(&L);
if(i=1){
printf("線性表清除成功\n");
}else{
printf("線性表清除失敗\n");
}
ListInsert(&L,1,0);
printf("L表頭插入0後:L.data:\n");
ListTraverse(L);
i=GetElem(L,1,&e);
if(i=1){
printf("第1個元素的值:%d\n",e);
}else{
printf("查找元素不存在\n");
}
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf("第%d個元素的值為%d\n",k,j);
else
printf("沒有值為%d的元素\n",j);
}
i=InitSqList(&Lb);
for(j=6;j<=15;j++)
i=ListInsert(&Lb,1,j);
printf("插入10個元素後,依次輸出Lb的元素:");
ListTraverse(Lb);
j=5;
ListDelete(&Lb,j,&e); /* 删除第5個資料 */
printf("删除第%d個的元素值為:%d\n",j,e);
printf("删除後依次輸出Lb的元素:");
ListTraverse(Lb);
return 0;
}