單鏈表的實現及其基本操作


結點的引入

      鏈表是一種鏈式存儲結構,鏈式存儲結構的特點是用一組任意的存儲單元存儲數據元素。為了能正確表示數據元素之間的線性關系,需引入結點概念。一個結點表示鏈表中的一個數據元素,節點中除了儲存數據元素的信息, 還必須存放指向下一個節點的的指針(單、雙鏈表的最后一個節點除外,它們存儲的是一個空指針NULL)   

結點的結構如下圖所示:

  

代碼如下:

1 typedef struct node{
2     int data;
3     struct node* pNext;
4 }Node,  *PNode;
View Code

注:這里假設結點中儲存的是整型 (int) 的數據

 單鏈表由多個結點依次連接而成,我們不難想象出它結構:

我們注意到:在第一個結點的前面多了一個頭結點,這是為了處理空表的方便而引入的,它的指針指向鏈表的第一個結點,而它的data域不存放任何信息。

 

單鏈表的基本操作

 1.創建鏈表

 1 PNode createList()
 2 {
 3     int len, value;
 4     
 5     PNode pHead = (PNode)(malloc(sizeof(Node)));
 6     PNode pTail = pHead;
 7     pTail->pNext = NULL;
 8     
 9     printf("請輸入你要的節點個數:");
10     scanf("%d", &len);
11     for(int i=1;i<=len;i++){
12         printf("請輸入第%d個節點的值:", i);
13         scanf("%d", &value);
14         
15         PNode pNew = (PNode)malloc(sizeof(Node));
16         pNew->data = value;
17         pTail->pNext = pNew;
18         pTail = pNew;
19         pTail->pNext = NULL;    
20     }
21     
22     return pHead;
23 }
View Code

2.遍歷鏈表

void traverse(PNode pHead)
{
    printf("遍歷結果為:\n");
    PNode pTra = pHead;
    while(pTra->pNext != NULL)
    {
        printf("%d ", pTra->pNext->data);
        pTra = pTra->pNext;
    }
    printf("\n");
}
View Code

3.判斷鏈表是否為空

1 bool isEmpty(PNode pHead)
2 {
3     if(pHead->pNext==NULL)
4       return true;
5     else
6       return false;
7 }
View Code

 4.鏈表長度

 1 int length(PNode pHead)
 2 {
 3     int len = 0;
 4     while(pHead->pNext!=NULL){
 5         pHead = pHead->pNext;
 6         len++;
 7     }
 8     return len;
 9     
10 }
View Code

 5.插入結點

 1 bool insert(PNode pHead, int pos, int val)
 2 {
 3     if(pos<1 || pos>length(pHead)){
 4         return false;
 5     }else{
 6         PNode pInsert = pHead;
 7         for(int i=1;i<pos;i++){
 8             pInsert = pInsert->pNext;
 9         }
10         
11         PNode pNew = (PNode)malloc(sizeof(Node));
12         pNew->data = val;
13         pNew->pNext = pInsert->pNext;
14         pInsert->pNext = pNew;
15         
16         return true;
17     }
18     
19 }
View Code

 6.刪除結點

 1 bool del(PNode pHead, int pos)
 2 {
 3     if(pos<1 || pos>length(pHead)){
 4         return false;
 5     }else{
 6         PNode pDel = pHead;
 7         for(int i=1;i<pos;i++){
 8             pDel = pDel->pNext;
 9         }
10         
11         if(pos==length(pHead)){
12           free(pDel->pNext);
13           pDel->pNext = NULL;    
14         }else{
15             PNode pNext = pDel->pNext->pNext;
16             free(pDel->pNext);
17             pDel->pNext = pNext;
18         }
19         
20         return true;
21         
22     }
23     
24     
25 }
View Code

 7.查找節點

(1)按元素值查找

1 PNode locate(PNode pHead, int value)
2 {
3     PNode p = pHead->pNext;
4     while(p&&p->data!=value){      //NULL 是 0 
5         p = p->pNext;
6     }
7     return p;
8 }
View Code

(2)按序號查找

1 PNode get(PNode pHead, int k)
2 {
3     PNode p = pHead;
4     for(int i=1;i<=k;i++){
5         p = p->pNext;
6     }
7     return p;
8     
9 }
View Code

 

完整代碼

  1 #include<stdio.h>
  2 #include<stdlib.h> 
  3 typedef struct node{
  4     int data;
  5     struct node* pNext;
  6 }Node, *PNode;
  7  
  8 PNode createList();   
  9 void traverse(PNode pHead);
 10 bool isEmpty(PNode pHead);
 11 int length(PNode pHead);
 12 bool insert(PNode pHead, int pos, int val);
 13 bool del(PNode pHead, int pos);
 14 PNode get(PNode pHead, int k); //按序號查找
 15 PNode locate(PNode pHead, int value);//按值查找 
 16 
 17 int main(void)
 18 {
 19    //test
 20    
 21    return 0; 
 22 } 
 23 
 24 PNode createList()
 25 {
 26     int len, value;
 27     
 28     PNode pHead = (PNode)(malloc(sizeof(Node)));
 29     PNode pTail = pHead;
 30     pTail->pNext = NULL;
 31     
 32     printf("請輸入你要的節點個數:");
 33     scanf("%d", &len);
 34     for(int i=1;i<=len;i++){
 35         printf("請輸入第%d個節點的值:", i);
 36         scanf("%d", &value);
 37         
 38         PNode pNew = (PNode)malloc(sizeof(Node));
 39         pNew->data = value;
 40         pTail->pNext = pNew;
 41         pTail = pNew;
 42         pTail->pNext = NULL;    
 43     }
 44     
 45     return pHead;
 46 }
 47 
 48 
 49 void traverse(PNode pHead)
 50 {
 51     printf("遍歷結果為:\n");
 52     PNode pTra = pHead;
 53     while(pTra->pNext != NULL)
 54     {
 55         printf("%d ", pTra->pNext->data);
 56         pTra = pTra->pNext;
 57     }
 58     printf("\n");
 59 }
 60 
 61 bool isEmpty(PNode pHead)
 62 {
 63     if(pHead->pNext==NULL)
 64       return true;
 65     else
 66       return false;
 67 }
 68 
 69 int length(PNode pHead)
 70 {
 71     int len = 0;
 72     while(pHead->pNext!=NULL){
 73         pHead = pHead->pNext;
 74         len++;
 75     }
 76     return len;
 77     
 78 }
 79 
 80 bool insert(PNode pHead, int pos, int val)
 81 {
 82     if(pos<1 || pos>length(pHead)){
 83         return false;
 84     }else{
 85         PNode pInsert = pHead;
 86         for(int i=1;i<pos;i++){
 87             pInsert = pInsert->pNext;
 88         }
 89         
 90         PNode pNew = (PNode)malloc(sizeof(Node));
 91         pNew->data = val;
 92         pNew->pNext = pInsert->pNext;
 93         pInsert->pNext = pNew;
 94         
 95         return true;
 96     }
 97     
 98 }
 99 
100 bool del(PNode pHead, int pos)
101 {
102     if(pos<1 || pos>length(pHead)){
103         return false;
104     }else{
105         PNode pDel = pHead;
106         for(int i=1;i<pos;i++){
107             pDel = pDel->pNext;
108         }
109         
110         if(pos==length(pHead)){
111           free(pDel->pNext);
112           pDel->pNext = NULL;    
113         }else{
114             PNode pNext = pDel->pNext->pNext;
115             free(pDel->pNext);
116             pDel->pNext = pNext;
117         }
118         
119         return true;
120         
121     }
122     
123     
124 }
125 
126 PNode get(PNode pHead, int k)
127 {
128     PNode p = pHead;
129     for(int i=1;i<=k;i++){
130         p = p->pNext;
131     }
132     return p;
133     
134 }
135 PNode locate(PNode pHead, int value)
136 {
137     PNode p = pHead->pNext;
138     while(p&&p->data!=value){      //NULL 是 0 
139         p = p->pNext;
140     }
141     return p;
142 }
View Code

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM