| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 284 人关注过本帖
标题:突发奇想关于链表的衍生问题
只看楼主 加入收藏
TIMFannie
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2017-10-15
结帖率:84.21%
  已结贴   问题点数:50  回复次数:4   
突发奇想关于链表的衍生问题
下面两个函数将结构体数组s[]连接成为链表。除了红色字体外,其余都相同。
红色字体内,区别只是分别p与p->next两者赋值,为什么后者能连接成完整链表而前者不行。
有哪些要语法束缚着?
struct studentNode *CreateLinkList(struct student s[], int n)
{
   
   struct studentNode *head=null,*p=null;
   head=(studentNode *)malloc(sizeof(struct studentNode));
    if(n<1)return null;
      head->birth=s[0].birth;
     for(int j=0;j<10;j++)         
     head->name[j]=s[0].name[j];
    p=head;
    for(int i=1;i<n;i++)
   {
    p->next=(struct studentNode *)malloc(sizeof(studentNode));
      p->next->birth=s[i].birth;
     for(int j=0;j<10;j++)         
     p->next->name[j]=s[i].name[j];
    p=p->next;
    }
    p->next=null;

   return head;

}

正确


struct studentNode *CreateLinkList(struct student s[], int n)
{
   
   struct studentNode *head=null,*p=null;
   head=(studentNode *)malloc(sizeof(struct studentNode));
    if(n<1)return null;
      head->birth=s[0].birth;
     for(int j=0;j<10;j++)         
     head->name[j]=s[0].name[j];
    p=head->next;
    for(int i=1;i<n;i++)
   {
    p=(struct studentNode *)malloc(sizeof(studentNode));
      p->birth=s[i].birth;
     for(int j=0;j<10;j++)         
     p->name[j]=s[i].name[j];
    p=p->next;
    }
    p=null;

   return head;

}

错误
2018-01-11 15:09
TIMFannie
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2017-10-15
  得分:0 
问了好些问题,终于意识到核心迷惑点
2018-01-11 15:10
TIMFannie
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2017-10-15
  得分:0 
拜托大家了
2018-01-11 15:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:169
帖 子:6385
专家分:28002
注 册:2014-5-20
  得分:50 
p->next=(struct studentNode *)malloc(sizeof(studentNode));
p=(struct studentNode *)malloc(sizeof(studentNode));
p->next已经明确当前节点。
p这个新开的,与键表无关。
用p->next比较简洁。
用 p 的话可以这样,加多个q:
struct studentNode *CreateLinkList(struct student s[], int n)
{

    if (n < 1)
        return NULL;
    int i, j;
    struct studentNode *head, *p, *q;
    head=(struct studentNode *)malloc(sizeof(struct studentNode));
    head->birth=s[0].birth;
    for(j=0; j<10; j++)
        head->name[j]=s[0].name[j];
    head->next = NULL;
    q = head;
    for(i=1; i<n; i++)
    {
        p=(struct studentNode *)malloc(sizeof(struct studentNode));
        p->birth=s[i].birth;
        for(j=0; j<10; j++)
            p->name[j]=s[i].name[j];
        p->next = NULL;
        q->next = p;
        q = p;
    }
    return head;
}

2018-01-11 15:46
TIMFannie
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2017-10-15
  得分:0 
回复 4楼 吹水佬
奥,p=()malloc()给p分配新地址与p=p->next的后者无关,懂了
2018-01-11 15:52







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

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