second60 20180422
線性表是具有相同特性的資料元素的乙個有限序列。
adt list
資料物件:
d =
資料關係:
r=基本運算:
initlist(&l): 初始化線性表
destroylist(&l): 銷毀線性表
listempty(l): 線性表是為空
listlength(l): 線性表的長度
displist(l): 輸出線性表
getelem(l,i,&e):求線性表某元素
locateelem(l,e):按元素查詢
listinsert(&l, i, e):插入元素
listdelete(&l,i,e):刪除元素
}adt list
線性表中的所有元素按照其邏輯順序依次儲存到從儲存器中指定位置開始的一塊連續的儲存空間中。
線性表的元素型別為: elemtype
線性表的長度為: length
線性表的大小為: maxsize
線性表的順序儲存結構
typedef structsqlist; // 順序表型別
**如下,c語言版
, **已測試通過:
#include "stdio.h"
#define maxsize 12
typedef int elemtype;
typedef struct
sqlist;
void createlist(sqlist **list, elemtype a, int n)
(*list)->length = n;
}void initlist(sqlist **list)
void destroylist(sqlist **list)
}int listempty(sqlist *list)
int listlength(sqlist *list)
void displist(sqlist *list)
int getelem(sqlist *list,int i, elemtype *e)
int locateelem(sqlist *list, elemtype e)
int listinsert(sqlist **list, int i , elemtype e)
(*list)->data[i] = e;
(*list)->length ++;
return 1;
}int listdelete(sqlist **list, int i , elemtype *e)
/*測試**
*/int main()
;int value = 0;
sqlist *list;
initlist(list);
createlist(&list, a, 10);
printf("listlength=%d\n",listlength(list));
displist(list);
getelem(list, 3, &value);
printf("getelem 3 =%d\n", value);
listdelete(&list,3,&value);
printf("listdelete 3=%d\n",value);
displist(list);
listinsert(&list,3,888);
displist(list);
destroylist(&list);
displist(list);
getchar();
return 1;
}在鏈式儲存中,每個儲存結點包括元素本身外,還包含元素間的邏輯關係(結點的後繼結點)。
單鏈表:包含後繼
雙鏈表:包含前驅和後繼
在鏈式儲存中,為了便於插入和刪除演算法的實現,每個鍊錶帶有乙個頭結點,並通過頭結點的指標唯一標識該鍊錶。
單鏈表為例:
typedef struct lnode
linklist;
雙鏈表結構:
typedef struct dnode
dlinklist;
單鏈表,演算法實現,
c語言版
:#include "stdio.h"
typedef int elemtype;
typedef struct lnode
linklist;
void createlistf(linklist **list, elemtype a, int n)
}void createlistr(linklist **list, elemtype a, int n)
r->next = null;
}void initlist(linklist **list)
void destroylist(linklist **list)
free(p);
}int listempty(linklist *list)
int listlength(linklist *list)
return i;
}void displist(linklist *list)
printf("\n");
}int getelem(linklist *list, int i , elemtype *e)
if(p == null)
return 0;
else
}int locateelem(linklist *list,elemtype e)
if(p==null) return 0;
else return i;
}int listinsert(linklist **list, int i, elemtype e)
if(p==null)
return 0;
else
}int listdelete(linklist **list,int i,elemtype *e)
if(p== null) return 0;
else
}int main()
;linklist *list = null;
/*createlistf(&list, arr, 10); */
createlistr(&list, arr, 10);
displist(list);
listinsert(&list, 4, 444);
displist(list);
listdelete(&list,4,&value);
displist(list);
getelem(list, 4 , &value);
printf("getelem 4=%d\n",value);
printf("locateelem 9=%d\n",locateelem(list,8));
getchar();
return 1;
}線性表的兩種儲存方式:順序表和煉表,各有好處。
順序表的優點:
1. 隨機訪問
2. 除資料外,不用額外空間
3. 查詢效率高
順序表的缺點:
1. 浪費空間,在開始就占用maxsize記憶體
2. 大小固定不易擴充套件
3. 插入刪除效率低
鍊錶的優點:
1. 插入刪除效率高
2. 空間大小根據現有資料有關,不用預分配空間
鍊錶的缺點:
1. 查詢效率低
2. 不能隨機訪問
3. 每個結構需額外的指標,空間大
4. 經常插入刪除會造成記憶體碎片,影響效率和浪費記憶體空間
順序表:用途沒那麼廣,因為很多限制,擴充套件性難。
鍊錶在平時開發中,鍊錶是用的最多的資料結構之一。
因為鍊錶的插入和刪除的效率高。
同時為了避免鍊錶的缺點,造成大量記憶體碎片。
解決方法為:預分配空間方法,使用時找乙個空的結點,刪除時,並不真正刪除,只是標記為未使用。
半夜了,總結了線性表,加深自已的記憶,同時,也編譯過了**,直接拷貝就能執行。這裡都是最簡單的順序表和煉表。實際運用中,結構比較複雜,會新增很多欄位或標記,但原理都是一樣的,特別是鍊錶,運用非常廣,基本上用到動態擴充套件的陣列,都會用鍊錶,這裡主要是c運用中,
c++中直接用
stl的
vector
。雖然c++中的
stl提供了很多好用的容器,但本質的東西,還是要多用多練,才能知道使用的好處。建議都用
c來實現一遍,後面的資料結構內容,都會用
c來實現。用
c的好處就是:你可以把指標練的如火純青。
資料結構 線性表(C語言實現)
一.線性表 1 定義 是由同一型別的資料元素構成的有序序列的線性結構。2 儲存實現 順序儲存,鏈式儲存 順序儲存的優點 儲存密度大,由於用的是陣列不需要儲存位址。順序儲存的缺點 對順序表插入刪除時需要移動資料元素來實現,影響執行效率 鏈式儲存的優點 對線性表的插入刪除不需要移動資料元素,只需要修改鏈...
資料結構線性表C語言實現
include include define true 1 define false 0 define ok 1 define error 0 define infeasible 1 define overflow 2 define initsize 100 typedef int status t...
資料結構 線性表的C語言實現
1.什麼是線性表?2.線性表的抽象資料型別 3.線性表之順序表的c語言實現 include include define elementtype int define maxsize 5 1.定義結點和指標 typedef struct lnode list struct lnode struct ...