數據結構模板之一:順序表

①基本定義

線性表是具有相同特徵的數據結構元素的一個有限序列。

順序表即採用順序存儲結構的線性表,可以說是數據結構中最容易理解,也是最常用的存儲方式。


②存儲方式與結構

線性表(a1,a2,...,an-1,an)

↓(直接映射)

順序表

a1a2...an-1an

所有元素按其邏輯順序依次存儲到從計算機存儲器中某位置開始的一塊連續的存儲空間中。

所佔用的存儲空間大小爲sizeof(數據類型) * n,n爲線性表(或順序表)的長度。


③實現

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50                                     //這裏可以改變表的最大儲存值
typedef int ElemType;                                  //和數據類型
typedef struct
{
	ElemType data[MaxSize];
	int length;
}SqList;                                                //順序表類型SqList


/*****建立順序表*****/
void CreateList(SqList * &L,ElemType a[],int n)         
{
	int i=0,k=0;                                        //k表示L中的元素個數,初始值爲0
	L=(SqList *)malloc(sizeof(SqList));                 //分配存放線性表的空間
	while(i<n)                                          //i掃描數組a            (個人覺得此處條件有問題)
	{
		L->data[i]=a[i];                                //將元素a[i]存放到L中
		k++; i++;
	}
	L->length=k;                                        //設置L的長度爲k
}


/*****初始化線性表*****/
void InitList(SqList * &L)                                         
{
	L=(SqList *)malloc(sizeof(SqList));                 //分配存放線性表的空間
	L->length=0;                                        //置空線性表的長度爲0
}


/*****銷燬線性表*****/
void DestroyList(SqList * &L)
{
	free(L);                                            //釋放L所指的順序表空間
}


/*****判斷線性表是否爲空表*****/
bool ListEmpty(SqList *L)
{
	return (L->length==0);
}


/*****求線性表的長度*****/
int ListLength(SqList *L)
{
	return (L->length);
}


/*****輸出線性表*****/
void DispList(SqList *L)
{
	for(int i=0;i<L->length;i++)                           //掃描順序表輸出各元素值
		printf("%d",L->data[i]);
	printf("\n");
}


/*****求線性表中某個數據元素值*****/
bool GetElem(SqList *L,int i,ElemType &e)
{
	if(i<1 || i>L->length)
		return false;                                      //參數i錯誤時返回false
	e=L->data[i-1];                                        //取元素值
	return true;                                           //成功找到元素時返回true
}


/*****按元素值查找*****/
int LocateElem(SqList *L,ElemType e)
{
	int i=0;
	while(i<L->length && L->data[i]!=e)
		i++;                                                //查找元素e
	if(i>=L->length)
		return 0;
	else
		return i+1;                                         //找到後返回其邏輯序號
}


/*****插入數據元素*****/
bool ListInsert(SqList * &L,int i,ElemType e)
{
	int j;
	if(i<1 || i>L->length+1)
		return false;                                        //參數錯誤時返回false
	i--;                                                     //將順序表邏輯符號轉化爲物理符號
	for(j=L->length;j>i;j--)                                 //將data[i]及後面的元素後移一個位置
		L->data[j]=L->data[j-1]; 
	L->data[i]=e;                                            //插入元素e
	L->length++;                                             //順序表長度增1
	return true;                                             //成功插入返回true
}


/*****刪除數據元素*****/
bool ListDelete(SqList * &L,int i,ElemType &e)
{
	int j;
	if(i<1 || i>L->length)                                   //參數i錯誤時返回false
		return false;
	i--;                                                     //將順序表邏輯符號轉化爲物理符號
	e=L->data[i];
	for(j=i;j<L->length-1;j++)                               //將data[i]之後的元素前移一個位置
		L->data[j]=L->data[j]+1;
	L->length--;                                             //順序表長度減一
	return true;                                             //成功刪除返回true
}


int main()
{
	return 0;
}

值得一提的是,不需要死記模板,重要的是理解該存儲結構,部分算法例如插入數據元素,刪除數據元素應視具體情況自己編寫算法。

---代碼和部分內容參考自《數據結構教程》

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