3.1.0 線性表的順序存儲結構

相關知識參考《大話數據結構》

#include"stdio.h"
 
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20 /*  存儲空間初始分配量 */

typedef int Status;	/* Status 是函數的類型,其值是函數結果狀態代碼,如
					OK 等 */
typedef int ElemType;	/* ElemType 類型根據實際情況而定,這裏假設爲 int
						*/
typedef struct
{
	ElemType data[MAXSIZE];	/*  數組,存儲數據元素 */
	int length;	/*  線性表當前長度 */
}SqList;

/*  初始化順序線性表 */
Status InitList(SqList*L)
{
	L->length = 0;
	return OK;
}

/*  初始條件:順序線性表 L 已存在。操作結果:若 L 爲空表,則返回 TRUE,否則 返回 FALSE */
Status ListEmpty(SqList L)
{
	if (L.length == 0)
		return TRUE;
	else
		return FALSE;
}

/*  初始條件:順序線性表 L 已存在。操作結果:將 L 重置爲空表 */
Status ClearList(SqList *L)
{
	L->length = 0;
	return OK;
}

/*  初始條件:順序線性表 L 已存在,1≤i≤ListLength(L) */
/*  操作結果:用 e 返回 L 中第 i 個數據元素的值,注意 i 是指位置,第 1 個位置的數 組是從 0 開始 */
Status GetElem(SqList L, int i, ElemType *e)
{
	if (i > L.length||L.length==0||i<1)//三種情況都要考慮到
		return FALSE;
	*e = L.data[i-1];
	return OK;
}

/*  初始條件:順序線性表 L 已存在 */
/*  操作結果:返回 L 中第 1 個與 e 滿足關係的數據元素的位序。 */
/*  若這樣的數據元素不存在,則返回值爲 0 */
int LocateElem(SqList L, ElemType e)
{
	int i;
	if (L.length == 0)
		return 0;
	for (i = 0; i < L.length; i++)
	{
		if (L.data[i]==e)
			break;
	}
	if (i>L.length)
		return 0;
	return i + 1;
}
/**
*插入算法的思路:
*1、如果插入位置不合理,拋出異常;
*2、如果線性表長度大於等於數組長度,則拋出異常或動態增加容量;
*3、從最後一個元素開始向前遍歷得到第i個位置,分別將它們都向後移動一個位置;
*4、將要插入元素填入i處;
*5、表長加1;
*/
/*  初始條件:順序線性表 L 已存在,1≤i≤ListLength(L), */
/*  操作結果:在 L 中第 i 個位置之前插入新的數據元素 e,L 的長度加 1 */
Status Listlnsert(SqList*L, int i, ElemType e)
{
	if (L->length >= MAXSIZE)/*  順序線性表已經滿 */
		return ERROR;
	if (i<1 || i>L->length + 1)/*i不在範圍*/
		return ERROR;
	if (i <= L->length)/*  若插入數據位置不在表尾 */
	{
		for (int k = L->length - 1; k >= i - 1; k--)/*從線性表末尾開始,一直到第i個位置的數據往後移動一個單位*/
			L->data[k + 1] = L->data[k];
	}
	L->data[i - 1] = e;
	L->length++;
	return OK;
}
/**
*刪除算法的思路:
*1、如果刪除位置不合理,拋出異常;
*2、取出刪除元素;
*3、從刪除元素位置開始遍歷到最後一個元素位置,分別將它們都向前移動一個位置;
*4、表長減1;
*/
/*  初始條件:順序線性表 L 已存在,1≤i≤ListLength(L) */
/*  操作結果:刪除 L 的第 i 個數據元素,並用 e 返回其值,L 的長度減 1 */
Status ListDelete(SqList *L, int i, ElemType *e)
{
	if (L->length == 0)/*線性表爲零*/
		return ERROR;
	if (i<1 || i>L->length)/*刪除位置不正確*/
		return ERROR;
	if (i < L->length)/*如果刪除位置不在最後位置*/
	{
		for (int k = i; k < L->length; k++)/*從第i個位置開始,一直到數據末尾前一個的數據等於該位置後一個的數據*/
			L->data[k - 1] = L->data[k];
	}
	L->length--;/*若刪除位置在線性表末尾,則利用線性表長度將次省略了,此處不牽扯動態內存問題*/
	return OK;
}

/*  初始條件:順序線性表 L 已存在。操作結果:返回 L 中數據元素個數 */
int ListLength(SqList L)
{
	return L.length;
}
void unionL(SqList*La, SqList Lb)
{
	int La_len, Lb_len;
	ElemType e;
	La_len = ListLength(*La);
	Lb_len = ListLength(Lb);
	for (int i = 0; i < Lb_len; i++)
	{
		GetElem(Lb, i, &e);
		if (!LocateElem(*La, e))
			Listlnsert(La, ++La_len, e);/*La_len先++再進入函數,將e插入到La末尾*/
	}
}
int main()
{
	/*自己寫驗證*/
	
	return 0;
}


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