一、特點
1、表頭、表尾,其他元素有且僅有一個直接前驅和直接後繼
2、任何位置可以插入、刪除
二、存儲方式
1、順序表
2、鏈表(單向鏈表、雙向循環鏈表)
三、具體實現方式
1、順序表
問題:
用順序表存儲一些正整數,輸入正整數表示插入數據(比如輸入3表示插入3),輸入負整數表示刪除數據(比如輸入-2表示刪除2),輸入字符表示退出程序。插入和刪除的過程中保持該表遞增有序。
//seqlist.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define SIZE 10 /*數組的長度*/ typedef int datatype; /*定義結構體*/ typedef struct seqlist { datatype data[SIZE]; //數組 int last; //定位元素 }seq_list, *seq_plist; #endif //test.c #include "seqlist.h" int main(void) { int a; //輸入的數 int ret; seq_plist s; s = seqlist_init(); //初始化順序表 while(1){ printf("請輸入一個數:\n"); ret = scanf("%d", &a); if(ret != 1) exit(1); else if(data >= 0) seqlist_insert(s, a); else seqlist_del(s,-a); } return 0; } //seqlist.c #include "seqlist.h" seq_plist seqlist_init(void) //初始化函數 { seq_plist s; s = (seq_plist)malloc(sizeof(seq_list)); if(NULL == s){ printf("malloc failed!\n"); exit(1); } s->last = -1; return s; } void seqlist_insert(seq_plist s, typedata a) //插入函數 { if(seqlist_full(s)) return; int i,j; for(i = 0 ; i <= s->last; i++) if(a < s->data[i]) break; for(j = s->last; j >= i; j--) s->data[j+1] = s->data[j]; s->data[i] = data; s->last++; seqlist_show(s); } void seqlist_del(seq_plist s, typedata a) //刪除函數 { if(seqlist_empty(s)) return; int i,j; for(i = 0; i <= s->last; i++) if(a = s->data[i]) break; for(j = i; j < s->last; j++) s->data[j] = s->data[j+1]; s->last--; seqlist_show(s); } bool seqlist_full(seq_plist s) //判斷順序表是否已滿 { if(s->last == size-1) return true; else return false; } bool seqlist_empty(seq_plist s) //判斷順序表是否已空 { if(s->last == -1) return true; else return false; } void seqlist_show(seq_plist s) //打印順序表 { int i; for(i = 0; i <= s->last; i++) printf("%d\t", s->data[i]); printf("\n"); }