線性表類型的實現——————鏈表映像

        用一組地址任意的存儲單元存放線性表中的數據元素。

        以元素(數據元素的映象)  + 指針(指示後繼元素存儲位置) =  結點 (表示數據元素  或  數據元素的映象)

        以“結點的序列”表示線性表 稱作鏈表

結點和單鏈表的 C 語言描述

單鏈表的存儲結構定義 :

  1. typedef struct LNode {  
  2.     ElemType data;// 數據域  
  3.     struct LNode *next; // 指針域  
  4. } LNode, *LinkList; 

LinkList  L;  // L 爲單鏈表的頭指針

創建並初始化爲空表

  1. Status InitList(LinkList &L)  
  2. {  
  3.     // TODO (#1#): 創建空表  
  4.    L=(LinkList )malloc(sizeof(LNode));  
  5.    if(!L) return ERROR;  
  6.    L->next=NULL;  
  7.    return OK;  
  8.     //-------------------------------------  

將表L置空

  1. Status ClearList(LinkList &L)  
  2. {  
  3.     // TODO (#1#): 清空表  
  4.     LinkList p;  
  5.     while(L->next)  
  6.     {  
  7.         p=L->next;  
  8.         L->next=p->next;  
  9.         free(p);  
  10.     }  
  11.     return OK;  
  12.     //-------------------------------------  

求表L的長度

  1. int ListLength(LinkList L)  
  2. {  
  3.     // TODO (#1#): 鏈表求長度  
  4.     LinkList p = L->next;  
  5.     int j=0;  
  6.     while(p)  
  7.     {  
  8.         pp=p->next;  
  9.         ++j;  
  10.     }  
  11.     return j;  
  12.     //-------------------------------------  

取表L中的第i個元素,並用e返回. 操作成功返回OK,失敗時返回ERROR

  1. Status GetElem(LinkList L, int i, ElemType &e)  
  2. {  
  3.     // TODO (#1#): 實現取元素GetElem(L,i,&e)  
  4.     LinkList p;  
  5.     p=L->next;  
  6.     int j=0;  
  7.     while(p&&j<i)  
  8.     {  
  9.         pp=p->next;  
  10.         ++j;  
  11.     }  
  12.     if(!p || j>i)  
  13.         return ERROR;  
  14.     e=p->data;  
  15.     return OK;    
  16.     //-------------------------------------  
  17. }  

在表L中定位元素e首次出現的位置. 操作成功返回位序,失敗時返回0 
compare(a,b) 爲比較函數,匹配時返回true,否則返回false

 

  1. int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType))  
  2. {  
  3.     // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素  
  4.     LinkList p;   
  5.     int j;  
  6.     p = L->next; j = 1;  
  7.     while(p!=NULL) {  
  8.         if( compare(p->data,e) )  return j;  
  9.         pp=p->next;  
  10.     }  
  11.     return 0;  
  12.     //-------------------------------------  
  13. }  

在表L中插入第i個元素e. 操作成功返回OK,失敗時返回ERROR

 

  1. Status ListInsert(LinkList &L, int i, ElemType e)  
  2. {  
  3.     // TODO (#1#): 在鏈表中插入元素  
  4.     LinkList p;  
  5.     int j=0;  
  6.     LinkList s;  
  7.     p=L;  
  8.     while(p && j<i-1)  
  9.     {  
  10.         pp=p->next;  
  11.         ++j;  
  12.     }  
  13.     if(!p || j>i-1)  
  14.       return ERROR;  
  15.     s=(LinkList)malloc(sizeof(LNode));  
  16.     s->data=e;  
  17.     s->next=p->next;  
  18.     p->next=s;  
  19.     return OK;  
  20.     //-------------------------------------  
  21. }  

刪除表L中第i個元素,結果用e返回. 操作成功返回OK,失敗時返回ERROR

 

  1. Status ListDelete(LinkList &L, int i, ElemType &e)  
  2. {  
  3.     // TODO (#1#): 在鏈表中刪除元素  
  4.    LinkList p,q;  
  5.     int j=0;  
  6.     p=L;  
  7.     while(p->next&&j<i-1)  
  8.     {  
  9.         pp=p->next;  
  10.         ++j;  
  11.     }  
  12.     if(!(p->next)||j>i-1) return ERROR;  
  13.     q=p->next;  
  14.     p->next=q->next;  
  15.     e=q->data;  
  16.     free(q);  
  17.     return OK;  
  18.     //-------------------------------------  
  19. }  

 帶有附件,需要可以下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章