【C语言】循环添加节点(链式物理结构)

xiaoxiao2021-02-28  104

/* * 链式物理结构演示 * 添加不确定个节点,循环添加 * 步骤:新建结构体->将首尾相连->定义循环指针变量->定义新节点的变量->开始死循环,在循环中完成添加(输入一个数->分配动态空间给新建的结构体->将输入的值赋值给新建结构体内的变量,指针赋值空->用循环框架进行链接)->释放动态内存 * */ #include <stdio.h> #include <stdlib.h> typedef struct node { int num; struct node *p_next; } node; int main() { int num = 0; //用来记录用户输入的数字 node head = {0},tail = {0}; head.p_next = &tail;//刚开始时还没有有效节点,就将头尾相连 node *p_node = NULL, *p_tmp = NULL;//p_tmp是循环指针变量,p_node是新建节点 //死循环来无限输入 while(1) {//因为不知道输入多少个,所以用while printf("\n请输入一个正数:"); scanf("%d", &num); if(num < 0) {//输入的是负数的话就结束循环 break; } p_node = malloc(sizeof(node));//动态分配一个存储空间,所生成的链结构中所有有效值的空间都是动态分配的 if(!p_node) {//动态内存分配失败 continue; } p_node->num = num; //新加入的数赋值给结构体 p_node->p_next = NULL; //与该数配对的指针 for(p_tmp = &head; p_tmp != &tail; p_tmp = p_tmp->p_next) { node *p_first = p_tmp; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if(p_mid == &tail || p_mid->num > p_node->num) { p_first->p_next = p_node; p_node->p_next = p_mid; break; } } for(p_tmp = &head; p_tmp != &tail; p_tmp = p_tmp->p_next) { node *p_first = p_tmp; node *p_mid = p_first->p_next; node *last = p_mid->p_next; if(p_mid != &tail) { printf("%d ", p_mid->num); } } printf("\n"); } //清除动态内存 while(head.p_next != &tail) {//当头下一个不是尾时进入循环 node *p_first = &head; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; p_first->p_next = p_last;//先断开p_mid,然后再进行释放,也就是将p_first指向p_last free(p_mid); p_mid = NULL; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-60220.html

最新回复(0)