C++ 动态创建链表
#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; }