文章目錄
前言
- 什麼是
抽象數據類型
?
抽象數據類型(Abstract Data Type,簡稱ADT),具有類似行爲的特定數據結構的數學模型;抽象數據類型包括數據元素
、數據元素之間的關係
以及對數據元素的一些操作
,即帶有一些操作的數據對象的集合;而在C語言中,利用結構體(struct)來表示數據結構。
順序表ADT實現
對錶的操作( 所有操作前提是順序表存在)
- CreateList():創建順序表;
/*創建順序表時使用malloc函數可以爲表在堆中動態分配空間
(malloc函數可以使用也可以不用)*/
//創建表
SeqList *CreateList()
{
SeqList *seqList;
int length,i;
printf("請輸入順序表的長度:");
scanf("%d",&length);
if(length > MAX_SIZE)
{
printf("輸入不合法\n");
}
else
{
seqList = (SeqList *)malloc(sizeof(SeqList));
seqList->last = length;
for(i = 0; i < length; i++)
{
scanf("%d",&seqList->elem[i]);
}
printf("創建成功!\n");
return seqList;
}
}
- PrintList(SeqList *L):打印順序表;
//打印表
void PrintList(SeqList *L)
{
int i;
if(IsEmpty(L))
{
printf("順序表爲空!\n");
}
else
{
printf("輸出順序表:\n");
for(i = 0; i < L->last; i++)
{
printf("%d ",L->elem[i]);
}
printf("\n");
}
}
- DestroyList(SeqList *L):銷燬順序表,即刪除順序表;
/* 銷燬表時使用free函數清空順序表在堆中的空間,並需要將指針置空*/
//刪除表
void DestroyList(SeqList *L)
{
free(L);
printf("刪除成功!\n");
}
- ClearList(SeqList *L):清空順序表;
/* 清空順序表即將順序表的長度置爲0,線性表規定長度爲0表示空表*/
//置空表
void ClearList(SeqList *L)
{
L->last = 0;
printf("置空完成!\n");
}
對錶中元素的操作(操作的前提是順序表不爲空)
- Locate(SeqList *L, int x):定位元素,輸出元素在順序表中的位置;
//定位元素
void Locate(SeqList *L, int x)
{
int i;
for(i = 0; i < L->last; i++)
{
if(L->elem[i] == x)
break;
}
if(i == L->last)
{
printf("未找到元素!\n");
}
else
{
printf("查找結果:%d\n",i+1);
}
}
- GetData(SeqList *L, int i):查找元素,輸出指定位置的元素;
//查找元素
void GetData(SeqList *L, int i)
{
if(i >= L->last || i <= 0)
{
printf("查找位置不合法!\n");
}
else
{
printf("查找結果:%d\n",L->elem[i-1]);
}
}
- InsList(SeqList *L, int i, int x):插入元素,插入元素到指定位置;
//插入元素
void InsList(SeqList *L, int i, int x)
{
if(L->last+1 > MAX_SIZE)
{
printf("無法插入元素!\n");
}
else
{
if(i > L->last+1)
{
printf("插入位置錯誤,無法插入!!\n");
}
else
{
int j;
for(j = L->last; j >= i; j-- )
{
L->elem[j] = L->elem[j-1];
}
L->elem[i-1] = x;
L->last++;
printf("插入成功!\n");
}
}
}
- DelList(SeqList *L, int i):刪除指定位置元素;
//刪除指定位置元素
void DelList(SeqList *L, int i)
{
if(i >= L->last || i <= 0)
{
printf("刪除位置不合法!\n");
}
else
{
for(; i < L->last; i++)
{
L->elem[i - 1] = L->elem[i];
}
L->last--;
printf("刪除成功!\n");
}
}
- DelData(SeqList *L, int x):刪除指定元素;
//刪除指定元素
void DelData(SeqList *L, int x)
{
int i;
for(i = 0; i < L->last; i++)
{
if(L->elem[i] == x)
break;
}
if(i == L->last)
{
printf("未找到刪除的元素!\n");
}
else
{
for(i ; i < L->last-1; i++)
{
L->elem[i] = L->elem[i+1];
}
L->last--;
printf("刪除成功!\n");
}
}
順序表的存儲結構
順序表特點:物理存儲結構上連續,邏輯結構上相鄰。
順序表的數據結構:
typedef struct
{
//順序表數據結構
int elem[MAX_SIZE];
int last;
}SeqList;
//可以根據需要定義順序表中元素的類型
順序表插入操作實現
不論元素插入到什麼位置,插入點後的元素需要後移。
如何判斷順序表是否存在
定義一個結構體指針,初始狀態結構體指針指向爲NULL,即爲空指針;使用malloc函數爲順序表分配空間,此時結構體指針指向的時堆中動態分配的空間;通過判斷結構體指針是否爲空來說明順序表是否存在,銷燬順序表時,調用free函數清空堆中的空間,同時將結構體指針指向空。(關於C語言空指針深入瞭解)
順序表中指針傳遞問題
#include<stdio.h>
void test(int *p)
{
p = NULL;
}
int main()
{
int *p;
test(p);
if(p == NULL)
{
printf("這是空指針!\n");
}
else
{
printf("這是野指針!\n");
}
return 0;
}
//結果輸出爲野指針
在代碼中首先在主函數中定義了一個指針,然後我們調用函數將指針傳遞過去,在子函數中使用p= NULL(目的將指針設爲空指針),但是主函數中的指針卻並沒有指向NULL(C語言指針傳遞問題)
原因:傳遞指針,函數會先複製一個指針,兩個指針指向同一個地址,雖然子函數的指向改變了,但是並不會影響到主函數中的指針。
全部代碼
GitHub地址:Sequence.cpp