數據結構之順序表的初步認識以及增刪改查使用

        順序表是線性表的一種,還有一種是鏈表,順序表特點是必須依次存放,不可以跳躍式存放,順序表與鏈表不同之處在於順序表在物理上相鄰,可以簡單的理解爲它存放的數據地址相鄰,而鏈表則不是它是數據結構中的重要組成部分,它由兩部分元素構成,一種是保存的數據,另一種是數據的下表,這和我們以前學過的數組很相似,順序表是將表中的結點依次存放在計算機內存中一組地址連續的存儲單元中。使用它是需要用結構體進行定義:

-

typedef struct 
{
	int *elem;//指向動態內存的指針
	int length;//有效數據個數
	int listsize;//總單元個數
}DSeqList,*PDSeqList;

我們對順序表使用時一般進行初始化,增加數據,刪除數據,修改數據,查找數據,清空順序表等幾個操作,下面我給大家詳細的講一下這一系列操作。

首先是我們需要做的函數聲明:

void InitDSeqList(PDSeqList ps)
{
	assert(ps != NULL);

	ps->elem = (int *)malloc(INITSIZE *sizeof(int));
	ps->length = 0;
	ps->listsize = INITSIZE;
}

static bool IsFull(PDSeqList ps)
{
	return ps->length == ps->listsize;
}

//將ps的容量擴大到原來的2倍
static void Inc(PDSeqList ps)
{
	ps->elem = (int *)realloc(ps->elem,ps->listsize*2*sizeof(int));
	ps->listsize *= 2;
}

//將val插入在ps表中的pos位置
bool Insert(PDSeqList ps,int val,int pos)//O(n)
{
	if(pos<0 || pos>ps->length)
	{
		return false;
	}
	if(IsFull(ps))
	{
		Inc(ps);
	}

	for(int i=ps->length-1;i>=pos;i--)
	{
		ps->elem[i+1] = ps->elem[i];
	}
	ps->elem[pos] = val;
	ps->length++;

	return true;
}

bool Insert_begin(PDSeqList ps,int val)//O(n)
{
	return Insert(ps,val,0);
}

bool Insert_end(PDSeqList ps,int val)//O(1)
{
	return Insert(ps,val,ps->length);
}

//查找ps中第一個key的下標
int Search(PDSeqList ps,int key)
{
	for(int i=0;i<ps->length;i++)
	{
		if(ps->elem[i] == key)
		{
			return i;
		}
	}
	return -1;
}

//刪除ps中的第一個key
bool Delete(PDSeqList ps,int key)
{
	int index = Search(ps,key);
	return DeletePos(ps,index);
}

//刪除ps中第pos位置的數據
bool DeletePos(PDSeqList ps,int pos)
{
	if(pos<0 || pos>=ps->length)
	{
		return false;
	}
	for(int i=pos;i<ps->length-1;i++)
	{
		ps->elem[i] = ps->elem[i+1];
	}
	ps->length--;

	return true;
}

bool IsEmpty(PDSeqList ps)
{
	return ps->length == 0;
}

//清空數據
void Clear(PDSeqList ps)
{
	ps->length = 0;//ps->length == (*ps).length
}

//銷燬整個結構
void Destroy(PDSeqList ps)
{
	free(ps->elem);//1
	ps->elem = NULL;//2
	ps->length = 0;//3
	ps->listsize = 0;//4
	//ps = NULL;//5,沒有意義
}

int GetLength(PDSeqList ps)
{
	return ps->length;
}

void Show(PDSeqList ps)
{
	for(int i=0;i<ps->length;i++)
	{
		printf("%d ",ps->elem[i]);
	}
	printf("\n");
}

以上就是順序表的初步認識以及基本操作,順序表相當對來說還是比較簡單,瞭解基本結構以後可以輕鬆掌握。

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