首页 > 编程语言 > 详细

C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序)

时间:2015-12-05 20:48:54      阅读:510      评论:0      收藏:0      [点我收藏+]

一,数据结构——链表全操作:

     链表形式:

        技术分享

     其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点;

     特别说明:对于单链表,每个节点(Node)可以通过指针域(Node *next)来找到下一个节点,但却不能够找到上一个节点;

                   只需要知道头结点就可以确定整个链表;

                   对链表进行的操作一般都需要遍历链表,而链表结束的标志为NULL(要么next指针为空,要么头结点为空);

                   若要断开两个节点联系,要先保存下个节点,否则后面的节点无法找到;

                   关于链表逆序,思想为将指针方向对调,最后头节点为原链表最后一个节点;

  

     以下为链表增,删,改,查,逆序,排序的函数实现:

     link.h

技术分享
 1 #ifndef LINK_H_INCLUDED
 2 #define LINK_H_INCLUDED
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #define datatype int
 6 
 7 struct node
 8 {
 9     int num;
10     int data;
11     struct node* next;
12 };
13 
14 typedef struct node Node;
15 
16 void backaddnode(Node **ppnode, int num, datatype data);//增加节点
17 Node *backaddnodeA(Node *pnode, int num, datatype data);//
18 void showallnode(Node *pnode);//显示所有的节点
19 Node *searchfirst(Node *pnode, int num);//查询
20 int change(Node *pnode, int oldnum, int newnum);//修改失败返回0,成功返回1
21 Node *rev(Node *pnode);//链表的逆转
22 Node *del(Node *pnode, int num);//删除
23 Node *insert(Node *pnode, int findnum, int newnum, datatype data);//实现插入,前面插入
24 void sort(Node *pnode, char ch);//ch==>  ch==<
25 
26 
27 #endif // LINK_H_INCLUDED
View Code

     link.cpp

技术分享
  1 #include "link.h"
  2 
  3 void  backaddnode(Node **ppnode, int num, datatype data)
  4 {
  5     Node *newnode = (Node*)malloc(sizeof(Node));
  6     newnode->num = num;
  7     newnode->data = data;
  8     newnode->next = NULL;
  9 
 10     if (*ppnode == NULL)
 11     {
 12         *ppnode = newnode;
 13     }
 14     else
 15     {
 16         Node *p = *ppnode;
 17         while (p->next != NULL)
 18         {
 19             p = p->next;
 20         }
 21         p->next = newnode;
 22     }
 23 }
 24 
 25 Node *backaddnodeA(Node *pnode, int num, datatype data)
 26 {
 27     Node *newnode = (Node*)malloc(sizeof(Node));
 28     newnode->num = num;
 29     newnode->data = data;
 30     newnode->next = NULL;
 31 
 32     if (pnode == NULL)
 33     {
 34         pnode = newnode;
 35     }
 36 
 37     else
 38     {
 39         Node *p = pnode;
 40         while (p->next != NULL)
 41         {
 42             p = p->next;
 43         }
 44         p->next = newnode;
 45     }
 46     return pnode;
 47 }
 48 
 49 void showallnode(Node *pnode)
 50 {
 51     printf("链表:\n");
 52     while (pnode != NULL)
 53     {
 54         printf("%d->", pnode->data);
 55         pnode = pnode->next;
 56     }
 57     printf("NULL\n");
 58 }
 59 
 60 Node *searchfirst(Node *pnode, int num)
 61 {
 62     while (num != pnode->num&&pnode != NULL)
 63     {
 64         pnode = pnode->next;
 65     }
 66     return pnode;
 67 }
 68 
 69 int change(Node *pnode, int oldnum, int newnum)
 70 {
 71     while (oldnum != pnode->num&&pnode != NULL)
 72     {
 73         pnode = pnode->next;
 74     }
 75     if (pnode != NULL)
 76     {
 77         pnode->num = newnum;
 78         return 1;
 79     }
 80     else
 81     {
 82         return 0;
 83     }
 84 }
 85 
 86 Node *del(Node *pnode, int num)
 87 {
 88     Node *p = pnode;
 89     Node *ppre = pnode;
 90 
 91     while (p->num != num&&p != NULL)
 92     {
 93         ppre = p;
 94         p = p->next;
 95     }
 96     if (p != pnode)
 97     {
 98         ppre->next = p->next;
 99         free(p);
100         p = NULL;
101 
102     }
103     else
104     {
105         pnode = pnode->next;
106         free(p);
107     }
108     return pnode;
109 }
110 
111 Node * insert(Node *pnode, int findnum, int newnum, datatype data)
112 {
113     Node *newnode = (Node*)malloc(sizeof(Node));
114     newnode->num = newnum;
115     newnode->data = data;
116     newnode->next = NULL;
117     Node *p = pnode;
118     Node *ppre = pnode;
119     while (p->num != findnum&&p != NULL)
120     {
121         ppre = p;
122         p = p->next;
123     }
124 
125     if (p == pnode)
126     {
127         newnode->next = pnode;
128         pnode = newnode;
129     }
130     else if (p != NULL)
131     {
132         ppre->next = newnode;
133         newnode->next = p;
134     }
135     return pnode;
136 }
137 
138 
139 void sort(Node *pnode, char ch)
140 {
141     if (ch == >)
142     {
143         Node temp;
144         for (Node *p1 = pnode; p1!=NULL; p1=p1->next)
145         {
146             for (Node *p2 = p1; p2 != NULL; p2 = p2->next)
147             {
148                 if (p1->data<p2->data)
149                 {
150                     temp.num = p1->num;
151                     p1->num = p2->num;
152                     p2->num = temp.num;
153 
154                     temp.data = p1->data;
155                     p1->data = p2->data;
156                     p2->data = temp.data;
157                 }
158             }
159         }
160     }
161     else
162     {
163         Node temp;
164         for (Node *p1 = pnode; p1 != NULL; p1 = p1->next)
165         {
166             for (Node *p2 = p1; p2 != NULL; p2 = p2->next)
167             {
168                 if (p1->data>p2->data)
169                 {
170                     temp.num = p1->num;
171                     p1->num = p2->num;
172                     p2->num = temp.num;
173 
174                     temp.data = p1->data;
175                     p1->data = p2->data;
176                     p2->data = temp.data;
177                 }
178             }
179         }
180     }
181 }
182 
183 Node *rev(Node *pnode)
184 {
185     Node *p1, *p2, *p3;
186     if (pnode == NULL || pnode->next==NULL)
187     {
188         return pnode;
189     }
190     else
191     {
192         p1 = pnode;
193         p2 = pnode->next;
194         while (p2 != NULL)
195         {
196             p3 = p2->next;
197             p2->next = p1;
198             p1 = p2;
199             p2 = p3;
200         }
201         pnode->next = NULL;
202         pnode = p1;
203         return pnode;
204     }
205 }
View Code

 

C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序)

原文:http://www.cnblogs.com/weiyikang/p/5022127.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!