| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2453 人关注过本帖, 1 人收藏
标题:请指点一下关于链表和指针的问题
只看楼主 加入收藏
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏(1)
 问题点数:0 回复次数:9 
请指点一下关于链表和指针的问题
最近在学链表和指针,还做了学生证管理程序,就是用的链表和指针。其中有很多不理解的,希望可以知道原因。。。
one *addrecord(one *p)        /* 输入一组记录,添加到链表中     *p是一开始定义的一个空指针 */
{
    one head, *q;           /*head是一个one结构体,one结构体最后是一个*next指针,*q是这个自定义函数声明的一个指针*/
   
    head.next = p;          /*p移动到head这个one结构体的最后那个*next指针的位置*/
    p = &head;              /*将head的地址赋给指针*p          为什么,为什么p先要指向head那个结构体的末尾的那个指针,/*之后又要指向head的地址?为什么要这样做,这样做的意义在于?我试着把这一句和上面一句改了一下直接写p=&head或者*p=head都是可以编译可以构建但是运行就报错,这又是为啥?*/
    while (p->next!=NULL)        /* 将当前指针移动到链表尾端 */
        p = p->next;            /*这一句似乎又产生了一个one结构体,因为p指针在链表尾端又向后移动了一个next指针*/
   
    while(1) {
        char text[80];
        
        q = (one *)malloc(sizeof(one));       /*请求分配一个one结构体的内存*/
        if (q==NULL)
            return head.next;                 /*分配不了就回头指针(是head这个one结构体的最后那个next指针。。。为什么是返回这里?刚才不是把head的地址赋值给p了吗,为什么不返回head而是返回head.next?*/
        q->next = NULL;                       
        printf("\n\n输入姓名   学号   班级   (用空格分隔): ");
        gets(text);                                /* 读取一行文本 */
        if (text[0]=='\0')     break;                /* 空行为结束标志 */
        sscanf(text, "%s%s%s", q->name,q->no,q->classes);    /* 分解名称和电话号码 */
        p->next = q;            /* 在链表尾端添加结点 */
        p = q;                    /* 更新当前指针 这是请求成功之后的操作,大概能懂,不直接写p是因为当初用q才能请求分配内存。。。应该是这样*/
    }
   
    return head.next;             /*分配不了就回头指针(是head这个one结构体的最后那个next指针。。。*/
}




void display (one *p)          /* 显示所有记录信息 */
{
    printf("\n姓名\t\t学号\t\t班级\n");
    for (; p!=NULL; p=p->next)
        printf("%-10s\t%-10s\t%-10s\n", p->name, p->no,p->classes);
    printf("\n");
}

这个比上一个好懂多了,不为空指针就显示。。。而且也不需要在加一个one结构体head,为什么呢,我是说为什么刚才链表添加数据需要加一个head结构体呢。。。
啥都不会好苦恼啊。。。。。。
搜索更多相关主题的帖子: 管理程序 学生证 结构体 记录 
2016-12-12 14:11
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
那啥,我把问题都写注释里了。。。求解惑。。。。。。!

碧蓝航线真好玩
2016-12-12 14:11
LG隐
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:67
专家分:198
注 册:2016-4-20
收藏
得分:0 
表示没耐心。
2016-12-12 15:00
shasheng
Rank: 3Rank: 3
来 自:李猜
等 级:论坛游侠
威 望:1
帖 子:22
专家分:103
注 册:2016-1-7
收藏
得分:0 
你可以画图,画几个连续的链表用来模拟程序中的链表运行,就可以分析出链表头和链表尾的最终走向
2016-12-12 18:32
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 4楼 shasheng
走向我大概知道,我不知道为什么要那样走。。。

碧蓝航线真好玩
2016-12-12 23:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉楼主发的代码不完整,猜测one是typedef定义的新类型变量。还有头指针head不加*,感觉传入参数的内容要靠推断了,我还试着推算p是什么东东来的,感觉之前已经有个链表模板了,那函数用来加长链表长度的~虽然*p也可以是个指向空的指针……至于你说head.next,应该是head不放内容,head.next才开始有内容,head只是一个引子~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-12 23:29
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 6楼 九转星河
是这样,p才是一开始定义的一个空指针,为什么要在前面在放一个head的one结构体?head不是指针是一个one结构体。

碧蓝航线真好玩
2016-12-13 06:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 7楼 y529879803
因为head作为结构体时已经有分配空间,而作为指针时并没有开辟空间,如果没有指向,就不能有p->next这种说法

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-13 09:07
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
收藏
得分:0 
one head, *q;  
head.next = p;          /*p移动到head这个one结构体的最后那个*next指针的位置*/
注意这两条代码,head还没有赋值,怎么就可以让head.next = p 呢?
楼主这里的head是不是相当于通常的root?链表有多种技术,有设置one *root, 也有设置one **rootp的
简单链表还是比较容易实现的。。。
没有看到你全部的代码,没法调出你的错误在哪里   

一切都在学习、尝试、摸索中
2016-12-13 09:26
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
哦,这样我就稍微清楚点了,感谢dalao!!

[此贴子已经被作者于2016-12-13 18:51编辑过]


碧蓝航线真好玩
2016-12-13 18:18
快速回复:请指点一下关于链表和指针的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040594 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved