为了账号安全,请及时绑定邮箱和手机立即绑定

p2是一个只分配过一次内存的存储空间,每次都把p1往p2里写不会覆盖吗?

p2不是只在循环体前分配过一次内存吗?第二次赋值后为什么没有覆盖掉之前的节点?我脑袋有点转不过来

正在回答

3 回答

这是链表的知识啊 else p2->next = p1;  在这句代码里面P2->next  指向了P1  然后把P1的值付给了P2  这个时候的 P2是另外一个内存空间   下一次用是不会覆盖上一次的地方的  P2最后会指向 最后一个节点  只需要找到头指针  根据链表的性质就可以输出整个链表了 

1 回复 有任何疑惑可以回复我~
#1

有话好说别打脸 提问者

谢谢,听你这么解释一下脑子好像转过弯来了
2015-12-03 回复 有任何疑惑可以回复我~
#2

有话好说别打脸 提问者

非常感谢!
2015-12-03 回复 有任何疑惑可以回复我~
//动态链表  同样具有头指针  每个节点包含数据和指向下一个节点的指针

#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;
}



0 回复 有任何疑惑可以回复我~

能把代码弄出来吗? 

0 回复 有任何疑惑可以回复我~
#1

有话好说别打脸 提问者

下面补上了按自己理解注释的代码,就是第24行那个p2=p1我不理解,为什么可以循环往p2赋值并且生成链表
2015-12-03 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

p2是一个只分配过一次内存的存储空间,每次都把p1往p2里写不会覆盖吗?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信