您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-06 18:48 330 查看
/*
* 链式物理结构演示
* 添加不确定个节点,循环添加
* 步骤:新建结构体->将首尾相连->定义循环指针变量->定义新节点的变量->开始死循环,在循环中完成添加(输入一个数->分配动态空间给新建的结构体->将输入的值赋值给新建结构体内的变量,指针赋值空->用循环框架进行链接)->释放动态内存
* */
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言