C語言順序表的構造、銷毀、清空、取值、插入、刪除和查詢


include<stdio.h>

include<string.h>

include<malloc.h>

include<stdlib.h>

define ERROR -2

define OK 1

define OVERFLOW -1

define LIST_INIT_SIZE 100

define LISTINCREASE 10

//實現順序表
typedef struct
{
int *elem;
int length;
int listsize;
}SqList;

//順序表的初始化
int InitList_Sq(SqList L)//參數有個星號,但顯示不出來
{
L->elem = (int
)malloc(sizeof(int) * LIST_INIT_SIZE);
if (!L->elem) exit(OVERFLOW);
L->length = 0;//順序表的空間大小不代表順序表的長度
L->listsize = LIST_INIT_SIZE;
return OK;
}

//順序表的銷除
void DestroyList(SqList *L)
{
L->length = 0;
L->listsize = 0;
free(L->elem);
L->elem = NULL;
}

//檢測是否實現構造和銷除功能
int main()
{
SqList p;
if (InitList_Sq(&p))
{
DestroyList(&p);
if (!(p.elem)) ("銷毀成功");
}
}

//順序表的清空
void ClearList(SqList *L)
{
if (!L->elem) exit(OVERFLOW);//清空表的的前提是表要存在
//順序表的清空代表着表里面沒有任何元素,但其本身的所申請的空間仍然還存在,所以只需將順序表的長度設為0即可
L->length = 0;
}

//檢測表有沒有清空
int main()
{
SqList p;
if (InitList_Sq(&p))
{
DestroyList(&p);
ClearList(&p);
printf("%d", p.length);
}
}

//判斷順序表是否為空表
bool ListEmpty(SqList L)//查詢操作不會改變順序表,所以形參不需要用指針
{
if (!L.elem) exit(OVERFLOW);//判斷表為空的前提是表要存在
if (L.length == 0) return OK;
else return 0;
}

//計算順序表的長度
int ListLength(SqList L)
{
if (!L.elem) exit(OVERFLOW);//計算表的長度的前提是表要存在
return L.length;
}

//向順序表中插入數據
int ListInsert(SqList L, int i, int e)//在第i個位置之前插入一個數據,i >= 1
{
if (!L->elem) exit(OVERFLOW);//向表中插入數據的前提是表要存在
if (i < 1 || i > L->length + 1)//i的范圍是順序表第一個元素之前和最后一個元素的下一個元素之前
return ERROR;
if (L->length == L->listsize)//插入之前應該判斷順序表是否已滿,如果滿了,就需要重新申請一塊更大的內存
{
L->elem = (int
)malloc(sizeof(int) * (L->listsize + LISTINCREASE));
if (!L->elem) exit(OVERFLOW);
L->listsize += LISTINCREASE;
}
for (int j = L->length - 1; j >= i - 1; j--)
{
L->elem[j + 1] = L->elem[j];
}
L->elem[i - 1] = e;
L->length++;
}

//檢測表的長度是否計算正確以及插入元素是否正確
int main()
{
SqList p;
InitList_Sq(&p);
ListInsert(&p, 1, 1);
ListInsert(&p, 1, 2);
int len = ListLength(p);
printf("%d %d %d", p.elem[0], p.elem[1], len);
}

//從數據表中刪除數據
int ListDelete(SqList *L, int i)//刪除第i個位置的元素
{
if (!L->elem) exit(OVERFLOW);//從表中刪除數據的前提是表要存在
if (L->length == 0) return ERROR;//在刪除元素之前需要檢查表中是否有元素可刪
if (i < 1 || i > L->length) return ERROR;//i的范圍應該是第一個元素到最后一個元素的位置
int e = L->elem[i - 1];
for (int j = i - 1; j < L->length - 1; j++)
{
L->elem[j] = L->elem[j + 1];
}
L->length--;
return e;
}

//檢測是否正確刪除數據
int main()
{
SqList p;
InitList_Sq(&p);
ListInsert(&p, 1, 1);
ListInsert(&p, 1, 2);
int len = ListLength(p);
printf("%d %d %d\n", p.elem[0], p.elem[1], len);
printf("%d\n",ListDelete(&p, 1));
for (int j = 0; j < p.length; j++)
printf("%d\n", p.elem[j]);
}

//查找數據元素i是否在順序表里,如果在,返回i的位置,如果不在,返回ERROR
int LocateElem(SqList L, int i)
{
int j, flag = 0;//找到了flag為1,沒找到為0
if (!L.elem) exit(OVERFLOW);
for (j = 0; j < L.length; j++)
{
if (L.elem[j] == i)
{
flag = 1;
break;
}
}
if (!flag) return ERROR;
else return j + 1;
}

//查詢第i個位置上的元素
int GetElem(SqList L, int i)
{
if (!L.elem) exit(OVERFLOW);
if (i < 1 || i > L.length) return ERROR;
return L.elem[i - 1];
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM