用一組地址任意的存儲單元存放線性表中的數據元素。
以元素(數據元素的映象) + 指針(指示後繼元素存儲位置) = 結點 (表示數據元素 或 數據元素的映象)
以“結點的序列”表示線性表 稱作鏈表
結點和單鏈表的 C 語言描述
單鏈表的存儲結構定義 :
- typedef struct LNode {
- ElemType data;// 數據域
- struct LNode *next; // 指針域
- } LNode, *LinkList;
LinkList L; // L 爲單鏈表的頭指針
創建並初始化爲空表
- Status InitList(LinkList &L)
- {
- // TODO (#1#): 創建空表
- L=(LinkList )malloc(sizeof(LNode));
- if(!L) return ERROR;
- L->next=NULL;
- return OK;
- //-------------------------------------
- }
將表L置空
- Status ClearList(LinkList &L)
- {
- // TODO (#1#): 清空表
- LinkList p;
- while(L->next)
- {
- p=L->next;
- L->next=p->next;
- free(p);
- }
- return OK;
- //-------------------------------------
- }
求表L的長度
- int ListLength(LinkList L)
- {
- // TODO (#1#): 鏈表求長度
- LinkList p = L->next;
- int j=0;
- while(p)
- {
- pp=p->next;
- ++j;
- }
- return j;
- //-------------------------------------
- }
取表L中的第i個元素,並用e返回. 操作成功返回OK,失敗時返回ERROR
- Status GetElem(LinkList L, int i, ElemType &e)
- {
- // TODO (#1#): 實現取元素GetElem(L,i,&e)
- LinkList p;
- p=L->next;
- int j=0;
- while(p&&j<i)
- {
- pp=p->next;
- ++j;
- }
- if(!p || j>i)
- return ERROR;
- e=p->data;
- return OK;
- //-------------------------------------
- }
在表L中定位元素e首次出現的位置. 操作成功返回位序,失敗時返回0
compare(a,b) 爲比較函數,匹配時返回true,否則返回false
- int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType))
- {
- // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素
- LinkList p;
- int j;
- p = L->next; j = 1;
- while(p!=NULL) {
- if( compare(p->data,e) ) return j;
- pp=p->next;
- }
- return 0;
- //-------------------------------------
- }
在表L中插入第i個元素e. 操作成功返回OK,失敗時返回ERROR
- Status ListInsert(LinkList &L, int i, ElemType e)
- {
- // TODO (#1#): 在鏈表中插入元素
- LinkList p;
- int j=0;
- LinkList s;
- p=L;
- while(p && j<i-1)
- {
- pp=p->next;
- ++j;
- }
- if(!p || j>i-1)
- return ERROR;
- s=(LinkList)malloc(sizeof(LNode));
- s->data=e;
- s->next=p->next;
- p->next=s;
- return OK;
- //-------------------------------------
- }
刪除表L中第i個元素,結果用e返回. 操作成功返回OK,失敗時返回ERROR
- Status ListDelete(LinkList &L, int i, ElemType &e)
- {
- // TODO (#1#): 在鏈表中刪除元素
- LinkList p,q;
- int j=0;
- p=L;
- while(p->next&&j<i-1)
- {
- pp=p->next;
- ++j;
- }
- if(!(p->next)||j>i-1) return ERROR;
- q=p->next;
- p->next=q->next;
- e=q->data;
- free(q);
- return OK;
- //-------------------------------------
- }
帶有附件,需要可以下載