C 數據結構:順序表的實現

前言

  • 什麼是抽象數據類型
    抽象數據類型(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

運行結果

運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章