#include<stdio.h>
#include<stdlib.h>
//-------- 線性表的動態分配順序存儲結構 -----------
int LIST_INIT_SIZE=100; //順序表存儲空間初始尺寸
int LISTINCREMENT=10; //順序表存儲空間分配增量
typedef int ElemType; //順序表元素的數據類型為整數
//存儲結構定義:順序表
typedef struct {
ElemType *elem; //存儲線性表元素的數組
int length; //表長度
int listsize; //存儲容量
int incrementsize; //擴展增量
} SqList;
//-------- 線性表的基本運算 -----------------------------
//輔助函數:顯示順序表元素
void print_Sq (SqList L) {
for(int i=0; i<L.length; i++) printf("%5d", L.elem[i]);
printf("\n");
}
//運算1:初始化空順序表L
void InitList_Sq(SqList *L, int initsize, int incresize) {// 算法2.4
L->elem = (ElemType *)malloc(initsize*sizeof(ElemType)); //分配數組空間
L->length=0; //表長度初值為0
L->listsize=initsize; //表空間初始尺寸
L-> incrementsize = incresize;
}
//運算2:銷毀順序表L// 算法2.8
void DestroyList_Sq(SqList *L) {
free(L->elem); //釋放表的數組存儲空間
L->elem=NULL; //清空指向數組的指針及表示表長度、數組尺寸的指示變量
L->length=0;
L->listsize=0;
}
//運算3:在順序表L中第i個位置前插入新元素e
void ListInsert_Sq (SqList *L, int i, ElemType e) {
if(i < 1 || i > L->length+1)
return ERROR;// i值不合法
//動態擴展空間,每次空間不足,空間長度增加 LISTINCREMENT
if(L->length == L->listsize)
{
ElemType * increspace = (ElemType *)realloc(L->elem,(L->listsize + LISTINCREMENT) * sizeof(ElemType));
if(! increspace)
exit(OVERFLOW);
L->elem = increspace;
L->listsize += LISTINCREMENT;
}
for(int j=L->length-1;j>i-1;j--)
{
L->elem[j+1]=L->elem[j];
}
L->elem[i-1]=e;
L->length++;
return OK;
}
//運算4:在順序表L中刪除第i個元素,用輸出變量e返回其值
void ListDelete_Sq (SqList *L, int i, ElemType* e) { //算法2.7
*e=L->elem[i-1];
printf("刪除的第%d的元素為:%d\n",i,*e);
for(int j=i-1;j<L->length;j++)
{
L->elem[j]=L->elem[j+1];
}
L->length--;
}
//運算5:在順序表L中找到第i個值與e相等的元素,返回其位序,否則返回0
int LocateElem_Sq (SqList L, ElemType e) { //算法2.5
for(int i=0;i<L.length;i++)
{
if(L.elem[i]==e)
return i+1;
}
return 0;
}