一,数据结构——链表全操作:
链表形式:
其中,每个节点(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
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 }
C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序)
原文:http://www.cnblogs.com/weiyikang/p/5022127.html