#define _CRT_SECURE_NO_WARNINGS #include <iostream> struct Node { int data; Node* next; }; Node* init_Node_m_head() //動態創建頭節點 { Node* temp = (Node*)malloc(sizeof(Node)); temp->data = 0; temp->next = NULL; return temp; //返回頭節點結構體指針 } void end_ADD(Node* Node_Data, Node* other) //傳入頭節點,和子節點,在尾部掛載節點 { Node* now_m_head = Node_Data; //定義一個變量指向頭節點的下一個節點 while (now_m_head->next!=NULL) //循環遍歷該節點是否是最后一個節點 { now_m_head = now_m_head->next; //如果該節點不是最后一個節點,則把當前指針指向下一個節點 } other->next = now_m_head->next; //找到最后一個節點,把空地址賦值給子節點的next now_m_head->next = other; //把最后一個節點賦值為子節點 } void printf_Node(Node* Node_Data) //打印鏈表 { Node* temp = Node_Data->next; while (temp != NULL) { printf("%d->", temp->data); temp = temp->next; } printf("NULL\n"); } Node* Node_init_zi(int n) //動態創建子節點 { Node* temp = (Node*)malloc(sizeof(Node)); //動態申請Node類型的結構體 if (temp == NULL) //如果申請內存失敗,則返回空 { return NULL; } temp->data = n; //將n賦值給結構體變量, return temp; } void Add(Node* Node_m_head, Node* other) //在頭節點后開始插入節點 { other->next = Node_m_head->next; //將子節點的next賦值為頭節點的next; Node_m_head->next = other; //將頭節點的next賦值為子節點 } Node* rand_add(Node* Node_m_head,int n,Node* other)//按指定位置插入數據 { Node* temp = Node_m_head->next; //指向下一個節點 Node* last = Node_m_head; // 指向頭節點 int i = 0; //定義一個位置 do { ++i; if (i == n) //如果當前的位置和所要查找的位置一樣,則把num存放到單鏈表上並掛在節點上 截斷的節點掛在該新生成的節點尾部 { Node* p=other; // 定義一個Node指針指向新節點 p->next = temp; //把截斷的鏈表掛載在p的next上 last->next = p; //把新生成的節點,掛載temp的后面 return Node_m_head; //返回頭節點數據 } if (temp != NULL) { last = temp; //把上一個節點指向當前節點 temp = temp->next;//把當前節點指向下一個節點 } } while (temp != NULL); printf("您輸入的位置有誤,鏈表中未存儲這么多的數據!\n"); printf("是否需要把數據插到最后面? 請輸入1或者0, 1則插入到節點尾部,否則結束!\n"); int k; scanf("%d",&k); if (k == 1) { Node* p = other; end_ADD(Node_m_head,p); return Node_m_head; } else return NULL; } Node* free_someone(Node* Node_m_head, int n) //指定刪除某一個位置的節點 { Node* temp = Node_m_head->next; //指向下一個節點 Node* last = Node_m_head; // 指向頭節點 int i = 0; //定義一個位置 do { ++i; if (i == n) //如果找到了該位置的節點 則把后面的節點的值掛到前面來 { last->next = temp->next; free(temp); printf("第%d個節點已釋放!\n", i); return Node_m_head; } else { last = temp; temp = temp->next; } } while (temp!= NULL); printf("大兄弟,鏈表中是空的,你想干啥??!\n"); return Node_m_head; } void clear(Node* Data_m_head) { Node* temp = Data_m_head->next; Node* now_jiedian; while (temp != NULL) { now_jiedian = temp; temp = temp->next; free(now_jiedian); } printf("釋放完成,鏈表已經清空\n"); printf("鏈表已更新,新的鏈表打印如下:\n"); printf_Node(Data_m_head); } void play() { printf("--------------------------------------\n"); printf("1:鏈表初始化\n"); printf("2:創建單鏈表並在鏈表尾部插入\n"); printf("3:創建單鏈表並在頭節點處插入\n"); printf("4:指定位置添加節點\n"); printf("5:指定刪除某個位置的節點\n"); printf("6:打印當前鏈表\n"); printf("7:退出程序\n"); printf("--------------------------------------\n"); Node* Node_Data1 = init_Node_m_head(); //初始化頭節點 while (1) { printf("請輸入選項\n"); int num; scanf("%d", &num); switch (num) { case 1: //初始化鏈表,將鏈表的內容全部清空並重新動態創建一個節點 clear(Node_Data1); break; case 2: //動態創建一個節點,並從尾部插入 printf("即將在尾部插入節點\n"); int num1, num2; printf("請輸入創建的單鏈表的個數(只能輸入整數):"); scanf("%d", &num1); for (int i = 0; i < num1; i++) { printf("請輸入創建鏈表的值(只能輸入整數):"); scanf("%d", &num2); Node* temp = Node_init_zi(num2); end_ADD(Node_Data1, temp); } printf("鏈表已更新,新的鏈表打印如下:\n"); printf_Node(Node_Data1); break; case 3: //動態創建一個節點,並從頭部插入 printf("即將在頭節點處插入一個節點\n"); int num3, num4; printf("請輸入創建的單鏈表的個數(只能輸入整數):"); scanf("%d", &num3); for (int i = 0; i < num3; i++) { printf("請輸入創建鏈表的值(只能輸入整數):"); scanf("%d", &num4); Node* temp = Node_init_zi(num4); Add(Node_Data1, temp); } printf("鏈表已更新,新的鏈表打印如下:\n"); printf_Node(Node_Data1); break; case 4: //指定位置進行插入 printf("即將在指定位置添加節點\n"); int num5, num6, num7; printf("請輸入創建的單鏈表的個數(只能輸入整數):"); scanf("%d", &num5); for (int i = 0; i < num5; i++) { printf("請輸入創建的鏈表的位置(只能輸入整數):"); scanf("%d", &num6); printf("請輸入創建鏈表的值(只能輸入整數):"); scanf("%d", &num7); Node* temp = Node_init_zi(num7); rand_add(Node_Data1, i+num6,temp); } printf("鏈表已更新,新的鏈表打印如下:\n"); printf_Node(Node_Data1); break; case 5: //指定位置刪除 int num8, num9; printf("即將要刪除一個節點\n"); printf("請輸入要刪除的單鏈表的個數(只能輸入整數):"); scanf("%d", &num8); for (int i = 0; i < num8; i++) { printf("請輸入要刪除的鏈表的位置(只能輸入整數):"); scanf("%d", &num9); free_someone(Node_Data1,i+num9); printf("鏈表已更新,新的鏈表打印如下:\n"); printf_Node(Node_Data1); } break; case 6: printf_Node(Node_Data1); break; case 7 : printf("----------程序即將退出----------"); exit(0); default: break; } } } int main() { play(); system("pause"); return 0; }