一.準(zhǔn)備工作做好:
對于需要建構(gòu)順序線性表的必備變量和結(jié)構(gòu)體
- 狀態(tài)量
- 內(nèi)存大小量、內(nèi)存增加量
- 重定義整形(int)類型變量
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREAMENT 10
#define ERROR -2
#define OK 1
#define TRUE 1
#define FLASE 0
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *elem;
int length;
int Listsize;
}Sqlist;
二、構(gòu)建初始化函數(shù)
- 分配空間(void×)malloc(LIST_INIT_SISE * sizeof(ElemType))
- 對于內(nèi)存是否分配成功的容錯性檢查(特殊返回值)
- 對于線性表空表的長度進(jìn)行初始化為0
- 定義內(nèi)存大小(方便以后比較是否需要擴(kuò)容)
Status InitList(Sqlist &L)
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem)
{
printf("硬盤存儲空間有限,無法開辟空間\n");
return ERROR;
}
L.length = 0;
L.Listsize = LIST_INIT_SIZE;//對于內(nèi)存大小不糾結(jié)于字節(jié)數(shù),而是能存儲的元素個數(shù)
return OK;
}
三、對線性表進(jìn)行初值填充
1.判斷當(dāng)前的存儲空間是否大于賦值的空間(內(nèi)存大小判斷檢查)
(2. 新開辟空間容錯性檢查
(2. 循環(huán)賦值
- 對線性表的長度賦值
Status ValueList(Sqlist &L)
{
int i,j;
printf("請輸入線性表表單個數(shù):");
scanf("%d",&i);
if(i > L.Listsize)//輸入表單數(shù),大于開辟內(nèi)存大小時
{
while(1)//開辟空間直到大于需要的范圍為止
{
if(i > L.Listsize)
{
L.elem = (ElemType *)realloc(L.elem,LIST_INCREAMENT*sizeof(ElemType));
L.Listsize += LIST_INCREAMENT;
}
else break;
}
}
for(j = 0 ;j < i; j++)
scanf("%d",&L.elem[i]);
L.length = i;//表單長度進(jìn)行賦值,保存
printf("賦值成功?。?!\n");
return OK;
}
三、重置空表
空表的定義:線性表中元素個數(shù)n(n>=0)定義為線性表的長度,n = 0時稱為空表。
- 空表時指針存在,線性表個數(shù)歸零。
Status ClearList(Sqlist &L)
{
if(L.elem)
{
L.length = 0;
printf("線性表重置成功?。?!\n");
return OK;
}
else
printf("重置失敗,線性表不存在?。?!\n");
return FLASE;
}
##四、判斷空表
1. 空表時指針存在,判斷線性表個數(shù)是否為零。
Status ListEmpty(Sqlist L)
{
if(L.elem)
{
if(L.length == 0){printf("此表為空表!?。n"); return TRUE;}
printf("此表不為空表?。?!\n");
return FLASE;
}
else
printf("判斷失敗,線性表不存在?。。n");
return ERROR;
}
五、線性表長度
- 直接返回值L.length
Status ListLength(Sqlist L)
{
printf("%d",L.length);
return OK;
}
六、獲取線性表元素
- 確定傳輸參數(shù)類型
- 判斷獲取的索引號是否出邊界
Status GetElem(Sqlist L ,int index )
{
int e;
if(index < 1 || index > L.length)
{
printf("獲取值失?。。。∷饕鲞吔?。\n");
return ERROR;
}
e = L.elem[index];
return e;
}
七、查找線性表元素
- 遍歷元素,找到輸出返回
- 找不到,返回ERROR。
Status Search(Sqlist L,ElemType e)
{
int j = 0;
for(;j < L.length; j++)
{
if(L.elem[j] == e)
{
printf("找到索引元素!?。∑渚幪柺?d號\n",j+1);
return j+1;
}
else
printf("未找到元素?。?!\n");
return FLASE;
}
return OK;
}
八、刪除線性表元素
- 判斷刪除索引是否大于線性表最大元素索引
- 找到指定位置,向前一位賦值。
Status DeleteList(Sqlist &L,int index)
{
if(index < 1 || index > L.length)
{
printf("刪除失?。。。∷饕鲞吔?。\n");
return ERROR;
}
else
{
int j = index- 1;
for(; j >= L.length-1 ; j++)
L.elem[j+1] = L.elem[j];
L.length--;
return OK;
}
}
九、插入線性表
- 插入值的范圍[ 1 ~ L.length+1 ] (在每一位的前面插入元素)
- 判斷是否出了索引邊界
Status DeleteList(Sqlist &L,int index)
{
if(index < 1 || index > L.length)
{
printf("刪除失?。。?!索引超出邊界。\n");
return ERROR;
}
else
{
int j = index- 1;
for(; j >= L.length-1 ; j++)
L.elem[j+1] = L.elem[j];
L.length--;
return OK;
}
}
十、主菜單
int main()
{
Sqlist L;
int e = 0,index;
while(1)
{
printf("1.初始化線性表,開辟空間\n");
printf("2.對線性表進(jìn)行賦值\n");
printf("3.對線性表進(jìn)行重置\n");
printf("4.判斷線性表是否為空表\n");
printf("5.獲取線性表長度\n");
printf("6.獲取線性表對應(yīng)元素\n");
printf("7.查找線性表對應(yīng)元素\n");
printf("8.刪除線性表對應(yīng)元素\n");
printf("9.插入線性表\n");
printf("10. 打印\n");
printf("11. 退出\n");
int x;
scanf("%d",&x);
switch(x)
{
case 1: InitList(L); break;
case 2: ValueList(L); break;
case 3: ClearList(L); break;
case 4: ListEmpty(L); break;
case 5: ListLength(L); break;
case 6:
{
printf("請輸入想要查找元素的索引號:\n");
scanf("%d",&index);
GetElem(L,index);
}break;
case 7:
{
printf("請輸入想要查找的元素:\n");
scanf("%d",&e);
Search(L,e);
}break;
case 8:
{
printf(" 請輸入刪除元素的索引號:\n");
scanf("%d",&index);
DeleteList(L,index);
}break;
case 9:
{
printf("請輸入插入元素的位置索引號:\n");
scanf("%d",&index);
printf("請輸入想要插入的元素:\n");
scanf("%d",&e);
InsertList(L,index,e);
}break;
case 10: PrintList(L);
case 11: exit(0);
}
}
return 0;
}