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

来源:5-2 Linux C 动态数据结构-动态链表

有话好说别打脸

2015-12-03 22:04

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

写回答 关注

3回答

  • 流浪_老
    2015-12-03 22:28:50
    已采纳

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

    有话好说别打...

    非常感谢!

    2015-12-03 22:47:12

    共 2 条回复 >

  • 有话好说别打脸
    2015-12-03 22:19:43
    //动态链表  同样具有头指针  每个节点包含数据和指向下一个节点的指针
    
    #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;
    }



  • 流浪_老
    2015-12-03 22:11:31

    能把代码弄出来吗? 

    有话好说别打...

    下面补上了按自己理解注释的代码,就是第24行那个p2=p1我不理解,为什么可以循环往p2赋值并且生成链表

    2015-12-03 22:22:31

    共 1 条回复 >

Linux C语言结构体

C语言的深入,帮助小伙伴们进一步的理解C语言,赶紧看过来

118294 学习 · 162 问题

查看课程

相似问题