有话好说别打脸
2015-12-03 22:04
p2不是只在循环体前分配过一次内存吗?第二次赋值后为什么没有覆盖掉之前的节点?我脑袋有点转不过来
这是链表的知识啊 else p2->next = p1; 在这句代码里面P2->next 指向了P1 然后把P1的值付给了P2 这个时候的 P2是另外一个内存空间 下一次用是不会覆盖上一次的地方的 P2最后会指向 最后一个节点 只需要找到头指针 根据链表的性质就可以输出整个链表了
//动态链表 同样具有头指针 每个节点包含数据和指向下一个节点的指针
#include<stdio.h>
#include<malloc.h>
struct weapon {
int price;
int atk;
struct weapon * next; // 定义链表结构体 这行是指针
};
struct weapon * create(){ //创建链表的函数
struct weapon *head; //头指针
struct weapon *p1, *p2; //两个指针变量 一个指向新创的 一个指向上一个节点
int n=0; //计算节点个数
p1=p2=(struct weapon *)malloc(sizeof(struct weapon)); //malloc 分配内存块的函数 sizeof 判断数据类型长度符
scanf("%d,%d",&p1->price,&p1->atk); //输入数据到第一个节点
head=NULL; //初值置空
while(p1->price!=0){ //判断输入结束条件
n++;
if(n==1) head=p1; //第一个节点让head指向这个节点
else p2->next = p1; //如果不是第一个节点 让上一个节点的next指向新节点
p2=p1; //每一次把新节点保存到p2
p1=(struct weapon *)malloc(sizeof(struct weapon)); //给p1重新分配空内存块
scanf("%d,%d",&p1->price,&p1->atk); //继续往p1写入数据 (从else开始执行)
}
p2->next = NULL; //写入完成后给最后一个节点的指向赋空
return (head);
}
int main(){
return 0;
}
能把代码弄出来吗?
Linux C语言结构体
118583 学习 · 166 问题
相似问题