单向链表模板
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 }
突然发现一直没有链表