22.双向链表增删查改

  • 双链表结点
    //双链表节点
    typedef struct LinkNode
    {
        int data;
        struct LinkNode *pPre;
        struct LinkNode *pNext;
    }node;
  • 创建一个结构体保存双链表的头和尾
    1 typedef struct info
    2 {
    3     node *head;//指向头部
    4     node *tail;//指向尾部
    5 }List;
  • 初始化List
    1 void init(List *p)
    2 {
    3     p->head = NULL;
    4     p->tail = NULL;
    5 }
  • 在链表头部插入数据
     1 void addDataHead(List *p, int data)
     2 {
     3     node *pnew = (node *)malloc(sizeof(node));
     4     pnew->data = data;
     5     pnew->pNext = NULL;
     6     pnew->pPre = NULL;
     7 
     8     if (p->head == NULL || p->tail == NULL)
     9     {
    10         //插入一个结点
    11         p->head = pnew;
    12         p->tail = pnew;
    13     }
    14     else
    15     {
    16         p->head->pPre = pnew;//前驱
    17         pnew->pNext = p->head;//后继
    18         p->head = pnew;//插入,头插
    19     }
    20 }
  • 在链表尾部插入数据
     1 void addDataBack(List *p, int data)
     2 {
     3     node *pnew = (node *)malloc(sizeof(node));
     4     pnew->data = data;
     5     pnew->pNext = NULL;
     6     pnew->pPre = NULL;
     7 
     8     if (p->head == NULL || p->tail == NULL)
     9     {
    10         //插入一个结点
    11         p->head = pnew;
    12         p->tail = pnew;
    13     }
    14     else
    15     {
    16         p->tail->pNext = pnew;
    17         pnew->pPre = p->tail;
    18         p->tail = pnew;
    19     }
    20 }
  • 显示链表的数据
     1 void show(List *p)
     2 {
     3     node *pshow = p->head;
     4     while (pshow != NULL)
     5     {
     6         printf("%4d", pshow->data);
     7         pshow = pshow->pNext;
     8     }
     9     printf("
    ");
    10 }
  • 反向显示链表的数据
     1 void revshow(List *p)
     2 {
     3     node *pshow = p->tail;
     4     while (pshow != NULL)
     5     {
     6         printf("%4d", pshow->data);
     7         pshow = pshow->pPre;
     8     }
     9     printf("
    ");
    10 }
  • 链表中查找数据
     1 node* find(List *p,int data)
     2 {
     3     node *ptmp = p->head;
     4     while (ptmp != NULL)
     5     {
     6         if (ptmp->data == data)
     7         {
     8             return ptmp;
     9         }
    10         ptmp = ptmp->pNext;
    11     }
    12     return NULL;
    13 }
  • 反向查找
     1 node* revfind(List *p, int data)
     2 {
     3     node *ptmp = p->tail;
     4     while (ptmp != NULL)
     5     {
     6         if (ptmp->data == data)
     7         {
     8             return ptmp;
     9         }
    10         ptmp = ptmp->pPre;
    11     }
    12     return NULL;
    13 }
  • 在指定数据之前插入数据
     1 void insertdata(List *p, int data, int newdata)
     2 {
     3     node *pnew = (node *)malloc(sizeof(node));
     4     pnew->data = newdata;
     5     pnew->pNext = NULL;
     6     pnew->pPre = NULL;
     7 
     8     //p1记录找到的位置
     9     node *p1 = NULL;
    10     p1 = p->head;
    11     while (p1 != NULL)
    12     {
    13         if (p1->data != data)
    14         {
    15             p1 = p1->pNext;
    16         }
    17         else
    18         {
    19             break;
    20         }
    21     }
    22     //中间情况
    23     if (p1 != p->head && p1 != p->tail)
    24     {
    25         pnew->pNext = p1;
    26         pnew->pPre = p1->pPre;
    27 
    28         p1->pPre->pNext = pnew;
    29         p1->pNext->pPre = pnew;
    30     }
    31     else if (p1 == p->head)
    32     {
    33         pnew->pNext = p1;
    34         p1->pPre = pnew;
    35         p->head = pnew;
    36 
    37     }
    38     else if (p1 == p->tail)
    39     {
    40         pnew->pNext = p1;
    41         pnew->pPre = p1->pPre;
    42 
    43         p1->pPre->pNext = pnew;
    44         p1->pPre = pnew;
    45     }
    46 }
  • 删除指定数据
     1 void deletedata(List *p, int data)
     2 {
     3     //p1遍历循环查找位置
     4     node *p1 = NULL;
     5     p1 = p->head;
     6     while (p1 != NULL)
     7     {
     8         if (p1->data == data)
     9         {
    10             p1 = p1->pNext ;
    11         }
    12         else
    13         {
    14             break;
    15         }
    16     }
    17     //p1记录找到的位置
    18     //中间情况
    19     if (p1 != p->head && p1 != p->tail)
    20     {
    21         p1->pPre->pNext = p1->pNext;
    22         p1->pNext->pPre = p1->pPre;
    23         free(p1);
    24     }
    25     else if (p1 == p->head)
    26     {
    27         p->head = p1->pNext;
    28         p1->pNext->pPre = NULL;
    29         free(p1);
    30     }
    31     else if (p1 == p->tail)
    32     {
    33         p->tail = p1->pPre;
    34         p1->pPre->pNext = NULL;
    35         free(p1);
    36     }
    37 }
  • main函数
     1 void main()
     2 {
     3     List dList;
     4     init(&dList);
     5     addDataHead(&dList,1);
     6     addDataHead(&dList, 2);
     7     addDataHead(&dList, 3);
     8     addDataHead(&dList, 4);
     9     addDataHead(&dList, 5);
    10     //addDataBack(&dList, 10);
    11     insertdata(&dList, 4, 939);
    12     show(&dList);
    13     /*revshow(&dList);
    14     node *pfind = find(&dList, 3);
    15     pfind->data = 12;
    16     show(&dList);*/
    17     /*deletedata(&dList, 3);
    18     show(&dList);*/
    19     system("pause");
    20 }

完整代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 //双链表节点
  5 typedef struct LinkNode
  6 {
  7     int data;
  8     struct LinkNode *pPre;
  9     struct LinkNode *pNext;
 10 }node;
 11 
 12 typedef struct info
 13 {
 14     node *head;//指向头部
 15     node *tail;//指向尾部
 16 }List;
 17 
 18 void init(List *p)
 19 {
 20     p->head = NULL;
 21     p->tail = NULL;
 22 }
 23 
 24 //在链表头部插入数据
 25 void addDataHead(List *p, int data)
 26 {
 27     node *pnew = (node *)malloc(sizeof(node));
 28     pnew->data = data;
 29     pnew->pNext = NULL;
 30     pnew->pPre = NULL;
 31 
 32     if (p->head == NULL || p->tail == NULL)
 33     {
 34         //插入一个结点
 35         p->head = pnew;
 36         p->tail = pnew;
 37     }
 38     else
 39     {
 40         p->head->pPre = pnew;//前驱
 41         pnew->pNext = p->head;//后继
 42         p->head = pnew;//插入,头插
 43     }
 44 }
 45 
 46 //在链表尾部插入数据
 47 void addDataBack(List *p, int data)
 48 {
 49     node *pnew = (node *)malloc(sizeof(node));
 50     pnew->data = data;
 51     pnew->pNext = NULL;
 52     pnew->pPre = NULL;
 53 
 54     if (p->head == NULL || p->tail == NULL)
 55     {
 56         //插入一个结点
 57         p->head = pnew;
 58         p->tail = pnew;
 59     }
 60     else
 61     {
 62         p->tail->pNext = pnew;
 63         pnew->pPre = p->tail;
 64         p->tail = pnew;
 65     }
 66 }
 67 
 68 //显示链表的数据
 69 void show(List *p)
 70 {
 71     node *pshow = p->head;
 72     while (pshow != NULL)
 73     {
 74         printf("%4d", pshow->data);
 75         pshow = pshow->pNext;
 76     }
 77     printf("
");
 78 }
 79 
 80 //反向显示链表的数据
 81 
 82 void revshow(List *p)
 83 {
 84     node *pshow = p->tail;
 85     while (pshow != NULL)
 86     {
 87         printf("%4d", pshow->data);
 88         pshow = pshow->pPre;
 89     }
 90     printf("
");
 91 }
 92 
 93 //链表中查找数据
 94 node* find(List *p,int data)
 95 {
 96     node *ptmp = p->head;
 97     while (ptmp != NULL)
 98     {
 99         if (ptmp->data == data)
100         {
101             return ptmp;
102         }
103         ptmp = ptmp->pNext;
104     }
105     return NULL;
106 }
107 
108 //反向查找
109 node* revfind(List *p, int data)
110 {
111     node *ptmp = p->tail;
112     while (ptmp != NULL)
113     {
114         if (ptmp->data == data)
115         {
116             return ptmp;
117         }
118         ptmp = ptmp->pPre;
119     }
120     return NULL;
121 }
122 
123 //在指定数据之前插入数据
124 void insertdata(List *p, int data, int newdata)
125 {
126     node *pnew = (node *)malloc(sizeof(node));
127     pnew->data = newdata;
128     pnew->pNext = NULL;
129     pnew->pPre = NULL;
130 
131     //p1记录找到的位置
132     node *p1 = NULL;
133     p1 = p->head;
134     while (p1 != NULL)
135     {
136         if (p1->data != data)
137         {
138             p1 = p1->pNext;
139         }
140         else
141         {
142             break;
143         }
144     }
145     //中间情况
146     if (p1 != p->head && p1 != p->tail)
147     {
148         pnew->pNext = p1;
149         pnew->pPre = p1->pPre;
150 
151         p1->pPre->pNext = pnew;
152         p1->pNext->pPre = pnew;
153     }
154     else if (p1 == p->head)
155     {
156         pnew->pNext = p1;
157         p1->pPre = pnew;
158         p->head = pnew;
159 
160     }
161     else if (p1 == p->tail)
162     {
163         pnew->pNext = p1;
164         pnew->pPre = p1->pPre;
165 
166         p1->pPre->pNext = pnew;
167         p1->pPre = pnew;
168     }
169 }
170 
171 //删除指定数据
172 void deletedata(List *p, int data)
173 {
174     //p1遍历循环查找位置
175     node *p1 = NULL;
176     p1 = p->head;
177     while (p1 != NULL)
178     {
179         if (p1->data == data)
180         {
181             p1 = p1->pNext ;
182         }
183         else
184         {
185             break;
186         }
187     }
188     //p1记录找到的位置
189     //中间情况
190     if (p1 != p->head && p1 != p->tail)
191     {
192         p1->pPre->pNext = p1->pNext;
193         p1->pNext->pPre = p1->pPre;
194         free(p1);
195     }
196     else if (p1 == p->head)
197     {
198         p->head = p1->pNext;
199         p1->pNext->pPre = NULL;
200         free(p1);
201     }
202     else if (p1 == p->tail)
203     {
204         p->tail = p1->pPre;
205         p1->pPre->pNext = NULL;
206         free(p1);
207     }
208 }
209 
210 void main()
211 {
212     List dList;
213     init(&dList);
214     addDataHead(&dList,1);
215     addDataHead(&dList, 2);
216     addDataHead(&dList, 3);
217     addDataHead(&dList, 4);
218     addDataHead(&dList, 5);
219     //addDataBack(&dList, 10);
220     insertdata(&dList, 4, 939);
221     show(&dList);
222     /*revshow(&dList);
223     node *pfind = find(&dList, 3);
224     pfind->data = 12;
225     show(&dList);*/
226     /*deletedata(&dList, 3);
227     show(&dList);*/
228     system("pause");
229 }
原文地址:https://www.cnblogs.com/xiaochi/p/8401061.html