C語言實現順序表增刪查改操作
線性表是最常用且最簡單的一種數據結構。線性表的順序表示指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。結構如下圖
圖片來自百度
- 爲了描述順序表,我們聲明一個結構,如下:
#define LIST_INIT_SIZE 100 //線性表存儲空間的初始分配量
#define LIST_INCREMENT 10 //線性表存儲空間的分配增量
typedef int ElemType; //數據元素的類型,假設是int型的
typedef struct{
ElemType *elem; //存儲空間的基地址
int length; //當前線性表的長度
int listsize; //當前分配的存儲容量
}SqList;
- 順序表初始化函數:
//創建線性表
int InitList(SqList &L)
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//開闢一個存儲空間,並把這塊存儲空間的基地址賦值給elem
if (!L.elem)
{
return -1; //空間分配失敗
}
L.length = 0; //當前長度
L.listsize = LIST_INIT_SIZE; //當前分配量
return 0;
}
- 添加元素到順序表
//插入元素
int InserElement(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1)
return -1;
if(L.length >= L.listsize)
{
ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize + LIST_INCREMENT)*sizeof(ElemType));
if (!newbase) return -1;//存儲空間分配失敗
L.elem = newbase;//新基址
L.listsize += LIST_INCREMENT;//增加存儲容量
}
//插入操作
ElemType *q, *p; //定義2個指針變量
q = &(L.elem[i-1]); //q爲插入位置(注意形參i是序號,序號是從從1開始的,而下標是從0開始的,因此這裏轉成下標後是i-1)
for (p = &(L.elem[L.length - 1]); p >= q; --p) //從ai到an-1依次後移,注意後移操作要從後往前進行
{
*(p + 1) = *p;
}
*q = e;
++L.length;//表長加1
return 0;
}
- 從順序表中刪除指定元素
//刪除元素
int ListDelete(SqList &L, int i, ElemType &e)
{
//判斷刪除位置的合法性
if (i<1 || i>L.length) return -1;
//刪除操作
ElemType *q, *p;//定義2個指針變量
p = &(L.elem[i - 1]);//p爲被刪除元素的位置(注意形參i是序號,序號是從從1開始的,而下標是從0開始的,因此這裏轉成下標後是i-1)
e = *p; //被刪除的元素賦值給e(可能用不到,也可能用到,所以保存給e吧)
q = L.elem + L.length - 1;//q指向表尾最後一個元素(q是最後一個元素的地址)
for (++p; p <= q; ++p) //從p的下一個元素開始依次前移
{
*(p - 1) = *p;
}
--L.length;//表長減1
return 0;
}
- 打印順序表
//打印線性表
int toString(SqList L)
{
for(int i=0;i<L.length;i++)
{
printf("%d ",L.elem[i]);
}
printf("\n");
}
- 查詢順序表中指定的元素
//定位目標元素
int LocateElem(SqList L, ElemType x)
{
int pos = -1;
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] == x)
{
pos = i;
}
}
return pos;
}
- 主函數
int main()
{
SqList list;
InitList(list);
for(int i=1;i<=10;i++)
{
InserElement(list,i,i);
}
toString(list);
int e;
ListDelete(list,2,e);
toString(list);
printf("被刪除的元素e=%d",e);
}
- 測試結果如下