在計算機中用一組位址連續的儲存單元依次儲存線性表的各個資料元素,稱作線性表的順序儲存結構。
順序儲存結構的主要優點是節省儲存空間,因為分配給資料的儲存單元全用存放結點的資料(不考慮c/c++語言中陣列需指定大小的情況),結點之間的邏輯關係沒有占用額外的儲存空間。採用這種方法時,可實現對結點的隨機訪問,即每乙個結點對應乙個序號,由該序號可以直接計算出來結點的儲存位址。但順序儲存方法的主要缺點是不便於修改,對結點的插入、刪除運算時,可能要移動一系列的結點。
優點:隨機訪問表中元素。缺點:插入和刪除操作需要移動元素。
線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的(注意,這句話只適用大部分線性表,而不是全部。比如,迴圈鍊錶邏輯層次上也是一種線性表(儲存層次上屬於鏈式儲存),但是把最後乙個資料元素的尾指標指向了首位結點)。
給出兩種基本實現:
/*
靜態順序儲存線性表的基本實現
*/#include #include #include #define list_initsize 100
#define elemtype int
#define status int
#define ok 1
#define error 0
typedef struct
sqlist;
//函式介紹
status initlist(sqlist *l); //初始化
status listinsert(sqlist *l, int i,elemtype e);//插入
status listdelete(sqlist *l,int i,elemtype *e);//刪除
void listprint(sqlist l);//輸出列印
void discreat(sqlist a,sqlist *b,sqlist *c);//拆分(按正負),也可以根據需求改
//雖然思想略簡單,但是要寫的沒有錯誤,還是需要鍛鍊coding能力的
status initlist(sqlist *l)
status listinsert(sqlist *l, int i,elemtype e)
for(j = l->length;j > i-1;j--)//從後往前覆蓋,注意i是從1開始
l->elem[j] = l->elem[j-1];
l->elem[i-1] = e;//在留出的位置賦值
(l->length)++;//表長加1
return ok;//反回成功
}status listdelete(sqlist *l,int i,elemtype *e)
void listprint(sqlist l)
void discreat(sqlist a,sqlist *b,sqlist *c)
}int main(void)
; initlist(&l);
initlist(&b);
initlist(&c);
for (i = 1; i <= 9; i++)
listinsert(&l,i,data[i-1]);
printf("插入完成後l = : ");
listprint(l);
listdelete(&l,1,&e);
printf("刪除第1個後l = : ");
listprint(l);
discreat(l , &b, &c);
printf("拆分l後b = : ");
listprint(b);
printf("拆分l後c = : ");
listprint(c);
printf("拆分l後l = : ");
listprint(l);
}
靜態:長度固定
動態:不夠存放可以加空間(搬家)
/*
子任務名任務:1_2 動態順序儲存線性表的基本實現
*/#include #include #include #define list_init_size 100
#define listincrement 10
#define status int
#define overflow -1
#define ok 1
#define error 0
#define elemtype int
typedef struct
sqlist;
//函式介紹
status initlist(sqlist *l); //初始化
status listinsert(sqlist *l, int i,elemtype e);//插入
status listdelete(sqlist *l,int i,elemtype *e);//刪除
void listprint(sqlist l);//輸出列印
void deletemin(sqlist *l);//刪除最小
status initlist(sqlist *l)
status listinsert(sqlist *l,int i,elemtype e)
for(j=l->length;j>i-1;j--)//從後往前覆蓋
l->elem[j] = l->elem[j-1];
l->elem[i-1] = e;//在留出的位置賦值
l->length++;//長度+1
return ok;
}status listdelete(sqlist *l,int i,elemtype *e)
void listprint(sqlist l)
listdelete(l,j+1,&e);//呼叫刪除,注意j要+1
}int main(void)
; initlist(&l);
for (i = 1; i <= 9; i++)
printf("插入完成後 l = : ");
listprint(l);
listdelete(&l, 2, &e);
printf("刪除第 2 個後l = : ");
listprint(l);
deletemin(&l);
printf("刪除l中最小值後l = : ");
listprint(l);
deletemin(&l);
printf("刪除l中最小值後l = : ");
listprint(l);
deletemin(&l);
printf("刪除l中最小值後l = : ");
listprint(l);
}
線性表 順序儲存實現
linearlist.h pragma once const int maxsize 20 typedef int datatype class dataarr class linearlist linearlist.cpp include linearlist.h include using na...
線性表的順序儲存實現
seqlist.h標頭檔案 1 線性表的順序儲存實現 2 3 ifndef seqlist h include 4 define seqlist h include 5 6 include 7 include 8 include 9 10 typedef int elementtype 11 def...
線性表順序儲存
線性表順序儲存結構的建立 插入結點 刪除結點 就地逆置。include stdio.h include malloc.h typedef struct slist,list void init list 線性表初始化 void insert list s,int p 線性表插入 void delet...