单向链表模板

  1 #include<fstream>
  2 #include <iostream>
  3 using namespace std;
  4 
  5 struct Node
  6 {
  7     int data;
  8     Node* next;
  9 };
 10 
 11 //初始化
 12 Node* InitNode()
 13 {
 14     Node *head = (Node*)malloc(sizeof(Node));
 15     if (head == NULL)   return NULL;
 16     (head)->data = 0;
 17     (head)->next = NULL;
 18     return head;
 19 }
 20 
 21 //头插法
 22 void HeadInsertNode(Node** head,int key)
 23 {
 24     Node* newnode = (Node*)malloc(sizeof(Node));
 25     newnode->data = key;
 26     newnode->next = (*head)->next;
 27     (*head)->next = newnode;
 28 }
 29 
 30 //尾插法
 31 void TailInsertNode(Node** head, int key)
 32 {
 33     Node* temp = *head;
 34     while (temp->next != NULL)
 35     {
 36         temp = temp->next;
 37     }
 38     Node* newnode = (Node*)malloc(sizeof(Node));
 39     newnode->data = key;
 40     newnode->next = NULL;
 41     temp->next = newnode;
 42 }
 43 
 44 //排序链表
 45 void SortNode(Node** head)
 46 {
 47     Node* t1;
 48     Node* t2;
 49     for (t1 = (*head)->next; t1 != NULL; t1 = t1->next)
 50     {
 51         for (t2 = t1->next; t2 != NULL; t2 = t2->next)
 52         {
 53             if (t1->data > t2->data)//从小到大
 54             {
 55                 Node* t3 = (Node*)malloc(sizeof(Node));
 56                 t3->data = t1->data;
 57                 t1->data = t2->data;
 58                 t2->data = t3->data;
 59             }
 60         }
 61     }
 62 }
 63 
 64 //删除该结点
 65 void deleteNode(Node** pre)
 66 {
 67     Node* node = (*pre)->next;
 68     (*pre)->next = (*pre)->next->next;
 69     delete(node);
 70 }
 71 
 72 //删除相同元素
 73 void SameDelete(Node** head)
 74 {
 75     if ((*head)->next != NULL)
 76     {
 77         Node* nownode = (*head)->next;
 78         while (nownode != NULL)
 79         {
 80             if (nownode->next != NULL)
 81             {
 82                 if (nownode->next->data == nownode->data)
 83                 {
 84                     deleteNode(&nownode);
 85                 }
 86                 else
 87                     nownode = nownode->next;
 88             }
 89             else
 90                 return;
 91         }
 92     }
 93 }
 94 
 95 //合并两个链表
 96 void MergeNode(Node** l1, Node** l2)
 97 {
 98     if ((*l1)->next != NULL)
 99     {
100         Node* nownode = *l1;
101 
102         while (nownode->next != NULL)
103         {
104             int flag = 0;
105             for (Node* temp = (*l2)->next; temp != NULL; temp = temp->next)
106             {
107                 if (nownode->next->data == temp->data)
108                 {
109                     flag = 1;
110                     deleteNode(&nownode);
111                     break;
112                 }
113             }
114             if (flag == 0)
115                 nownode = nownode->next;
116         }
117     }
118 }
119 
120 //输出链表
121 void PrintNode(Node** head)
122 {
123     if ((*head)->next != NULL)
124     {
125         Node* temp = (*head)->next;
126         while (temp != NULL)
127         {
128             cout << temp->data << " ";
129             temp = temp->next;
130         }
131         cout << endl;
132     }
133 }
134 
135 //翻转链表
136 void TurnOverNode(Node** head)
137 {
138     if ((*head)->next != NULL)
139     {
140         Node* pre;
141         Node* nownode = (*head)->next;
142         Node* nextnode = (*head)->next->next;
143         nownode->next = NULL;
144         while (nextnode != NULL)
145         {
146             pre = nownode;
147             nownode = nextnode;
148             nextnode = nextnode->next;
149             nownode->next = pre;
150         }
151         nextnode = (Node*)malloc(sizeof(Node));
152         nextnode->data = 0;
153         nextnode->next = nownode;
154         (*head) = nextnode;
155     }
156 }
157 
158 //用来读取文件
159 void CreateNode(Node** head)
160 {
161     fstream fp;
162     fp.open("  ", ios::in);
163     if (!fp.is_open()) return;
164 
165 
166     fp.close();
167 }
168 
169 //销毁链表所有结点
170 void DestroyNode(Node** head)
171 {
172     if ((*head)->next != NULL)
173     {
174         Node* temp1 = ( * head)->next;
175         Node* temp2;
176 
177         while (temp1!= NULL)
178         {
179             temp2 = temp1->next;
180             free(temp1);
181             temp1 = temp2;
182         }
183     }
184     *head = NULL;
185 }
186 
187 //删除倒数第n个结点
188 void DeleteNNode(Node** head,int n)
189 {
190     Node* temp1 = *head;
191     int step = n + 1;
192     while (step != 0)
193     {
194         temp1 = temp1->next;
195         if (temp1 == NULL)
196         {
197             cout << "没有第" << n << "个结点" << endl;
198             return;
199         }
200         step--;
201     }
202 
203     Node* temp2 = (*head);
204     while (temp2 != NULL)
205     {
206         temp2 = temp2->next;
207         temp1 - temp1->next;
208     }
209     deleteNode(&temp1);
210 }
211 
212 int main()
213 {
214     Node* head=InitNode();
215   
216     TailInsertNode(&head, 48);
217     TailInsertNode(&head, 60);
218     TailInsertNode(&head, 50);
219     TailInsertNode(&head, 88);
220     TailInsertNode(&head, 42);
221     TailInsertNode(&head, 30);
222     TailInsertNode(&head, 60);
223     TailInsertNode(&head, 48);
224     TailInsertNode(&head, 88);
225     TailInsertNode(&head, 73);
226     TailInsertNode(&head, 88);
227     TailInsertNode(&head, 30);
228     PrintNode(&head);
229 
230     SortNode(&head);
231     PrintNode(&head);
232 
233     SameDelete(&head);
234     PrintNode(&head);
235 
236     TurnOverNode(&head);
237     PrintNode(&head);   
238 
239     DestroyNode(&head);
240 }

 

突然发现一直没有链表

 

posted @ 2023-12-27 13:25  小菜碟子  阅读(10)  评论(0编辑  收藏  举报