一、線性表的特點
1、邏輯結構:①具有線性結構,有表頭(沒有前驅)、有表尾(沒有後繼)。②有且只有一個直接前驅和一個直接後繼。
2、操作規則:任意位置插入和刪除數據。
二、順序表
1、順序表和線性表的關係:順序表是線性表的順序存儲結構。
last:
①非空:表示最後一塊數據的下標。
②空:last = -1
三、用C語言實現順序表
1、構造存儲結構
#define SIZE 8
typedef int datatype;
typedef struct seqlist{
datatype data[SIZE];
int last;
}seq_list, *seq_plist;
2、初始化
初始化要完成的工作:①申請一塊空間。②設置last = -1。
/* 初始化 */
void init_seqlist(seq_plist *list)
{
*list = (seq_plist)malloc(sizeof(seq_list)); /* 申請內存空間 */
if (NULL == *list)
{
printf("申請內存失敗\n");
perror("malloc"); /* 打印申請內存失敗的原因*/
exit(1); /* 讓當前程序結束 */
}
(*list)->last = -1;
}
3、插入數據
①確定插入的位置
②移動舊的數據
③插入新的數據
④last++;
(1)、如下圖所示,在位置3後面插入一個新的數據,插入前last = 5。
(2)、如下圖所示,插入新數據後,last = 6。
/* 插入數據
list:順序表
i:新數據插入的位置
data:插入的新數據
*/
void insert_seqlist(seq_plist list, int i, datatype data)
{
int j = 0;
/* 從位置i開始將順序表的數據往後移動 */
for (j = list->last; j >= i; j--)
{
list->data[j+1] = list->data[j];
}
list->data[i] = data; /* 將data插入到i的位置 */
list->last++; /* 因爲last表示最後一個數據的下標,因此需要將last加1*/
}
4、刪除數據
①確定要刪除數據的位置。
②移動數據
③last–
如下圖所示,刪除數據前last爲5。
如下圖所示,刪除數據後last爲4。
/* 刪除數據
list:順序表
i:刪除數據的位置
*/
void delete_seqlist(seq_plist list, int i)
{
int j = 0;
/* 將位置i後面的數據全部往前面移動一個位置 */
for (j = i; j < list->last; j++)
{
list->data[j] = list->data[j+1];
}
list->last--; /* 因爲last表示最後一個數據的下標,因此需要讓last減去1 */
}
5、判斷順序表是否爲空
判斷數據是否爲空,只需判斷last是否爲-1。
/* 判斷順序表是否爲空
list:順序表
*/
void isempty_seqlist(seq_plist list)
{
if (-1 == list->last)
{
return true;
}
else
{
return false;
}
}
6、判斷順序表是否已經滿
判斷順序表是否已經滿,只需判斷last是否爲SIZE - 1。
/* 判斷順序表是否已滿
list:順序表
*/
bool isfull_seqlist(seq_plist list)
{
if ((SIZE - 1) == list->last)
{
return true;
}
else
{
return false;
}
}
四、練習題
用順序表存儲一些整數,要求如下:
①輸入正整數表示插入數據(比如輸入3表示插入3)。
②輸入負數表示刪除數據(比如輸入-2表示刪除2)。
③輸入字符表示退出程序。
④插入和刪除數據的過程中保持該順序表數據有序遞增。
1、將數據插入順序表,且保持數據有序遞增
/* 將數據插入順序表,且保持有序遞增
list:順序表
idata:要插入的數據
*/
void insert_data(seq_plist list, datatype idata)
{
int i = 0;
if(isfull_seqlist(list))
{
printf("順序表已滿!\n");
return;
}
/* 然順序表有序遞增插入 */
for(i = 0; i <= list->last; i++)
{
if(idata < list->data[i])
{
break;
}
}
insert_seqlist(list, i, idata);
}
2、將數據從順序表刪除,且保持數據有序遞
/* 將數據從順序表刪除,且保持有序遞增
list:順序表
ddata:要刪除的數據
*/
void delelet_data(seq_plist list, datatype ddata)
{
int i = 0;
if(isempty_seqlist(list))
{
printf("順序表爲空!\n");
return ;
}
for(i = 0; i <= list->last; i++)
{
if(ddata == list->data[i])
{
break;
}
}
if(i > list->last)
{
printf("%d 不在順序表中!\n", ddata);
return ;
}
delete_seqlist(list, i);
}
3、遍歷打印順序表
/* 遍歷打印順序表
list:順序表
*/
void show_seqlist(seq_plist list)
{
int i = 0;
for (i = 0; i <= list->last; i++)
{
printf("%d\t", list->data[i]);
}
}
4、主函數
int main(void)
{
seq_plist list;
datatype data;
int ret = 0;
init_seqlist(&list); /* 初始化順序表 */
while(1)
{
printf("請輸入一個除0之外的整數:");
ret = scanf("%d", &data); /* 輸入int型返回1,否則返回0 */
if(ret == 0) /* 輸入爲字符,退出while循環,程序結束 */
{
printf("Bye-bye!\n");
break;
}
else
{
if(data > 0) /* 輸入爲正整數,插入數據並打印新的順序表 */
{
insert_data(list, data);
show_seqlist(list);
}
else if(data < 0) /* 輸入爲負整數,刪除數據並打印新的順序表 */
{
delelet_data(list, -data);
show_seqlist(list);
}
else
{
/* code */
}
}
}
return 0;
}
5、實驗結果
(1)、輸入正整數時,增加數據且數據有序遞增:
(2)、當超過8個數據時會提示順序表已滿:
(3)、輸入負整數時,刪除數據,且數據有序遞增:
(4)、如果刪除數據不在順序表中,則提示該數據不在順序表中:
(5)、當數據刪除完之後,再刪除數據會提示順序表爲空: