相關知識參考《大話數據結構》
#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;
}