| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 869 人关注过本帖
标题:单向链表创建和输出的问题
只看楼主 加入收藏
whukeming
Rank: 2
等 级:论坛游民
帖 子:76
专家分:51
注 册:2008-8-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
单向链表创建和输出的问题
下面这个程序是不是把首结点给漏掉了,是从pHead->pNext指向的那个结点开始的。
感觉是这样,和书里的写法不一样,感觉就是漏了一个首结点的数据。求指导

程序代码:
//
//  main.c
//  链表创建和链表遍历算法演示复习
//
//  Created by Hu Keming on 13-5-27.
//  Copyright (c) 2013年 Hu Keming. All rights reserved.
//

# include "stdio.h"
# include "stdlib.h"


typedef struct Node
{
    int data;
    struct Node *pNext;

}NODE, *PNODE;

PNODE create_list(void);
void traverse_list(PNODE pHead);

int main(void)

{
    PNODE pHead = NULL; // 等价于 struct Node * pHead = NULL;
    
    //create_list()函数功能:创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
    pHead = create_list();
    
    traverse_list(pHead);
    
    return 0;
}

PNODE create_list(void)
{
    int len;
    int i;
    int val;
    
    //分配了一个不存放有效数据的头节点
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (NULL == pHead)
    {
        printf("分配失败,程序终止!\n");
        exit (-1);
    }
    
    PNODE pTail = pHead;
    pTail->pNext = NULL;
    
    printf("请输入您需要生成的结点的个数: len = ");
    scanf("%d", &len);
    
    for (i=0; i<len; i++)
    {
        printf("请输入第%d个节点的值: ", i+1);
        scanf("%d", &val);
        
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if (NULL == pNew)
        {
            printf("分配失败,程序终止!\n");
            exit (-1);
        }
        
        pNew->data = val;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail =pNew;
        
    }
    
    return pHead;

}

void traverse_list(PNODE pHead)
{
    PNODE p = pHead->pNext;
    
    while (NULL != p)
    {
        printf("%d ", p->data);
        p = p->pNext;
    }
    printf("\n");
    
    return;
}

2013-05-28 10:44
whukeming
Rank: 2
等 级:论坛游民
帖 子:76
专家分:51
注 册:2008-8-24
收藏
得分:0 
书里是这么写的,差不多,但是输出函数是p = head;而不是 p = head->next,我就搞不懂这里

程序代码:
struct Student * creat()                        //建立链表函数

{
    struct Student * head;
    struct Student * p1, * p2;
    
    n = 0;
    
    p1 = p2 = (struct Student *)malloc(LEN);
    
    printf("Now, Plese input num and score:\n");
    
    scanf("%ld, %f", &p1->num, &p1->score);
    
    head = NULL;
    
    while (p1->num != 0)
    {
        n = n+1;
        
        if (n == 1) head = p1;
        
        else p2->next = p1;
        
        p2 = p1;
        
        p1 = (struct Student *)malloc(LEN);
        
        scanf("%ld, %f", &p1->num, &p1->score);
        
    }
    
    p2->next = NULL;
    
    return (head);
    
}
void print(struct Student * head, long num)               //输出链表函数

{
    struct Student * p;
    
    printf("\nNow, These %d records are :\n", n);
    
    p = head;
    
    if (NULL != head)                                     //判断num是不是要剔除的num
    {
        if (num == p->num)
        {
            p = p->next;
        }
        
        while (NULL != p)
        {
           
            printf("%ld %.1f\n", p->num, p->score);
            
            p = p->next;
            
            
        }
    }
    
}

2013-05-28 10:58
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:10 
  pNode p = pHead->pNext;                            //将头节点的指针给予临时节点p
 p = head;  //将头结点赋值给p

Maybe
2013-05-28 11:45
whukeming
Rank: 2
等 级:论坛游民
帖 子:76
专家分:51
注 册:2008-8-24
收藏
得分:0 
回复 3楼 邓士林
不对吧,head是头指针,head->next 应该是第二个结点的指针吧。

head应该指向首结点,head->next 指向第二个结点,p = head->next,则p也指向第二个结点,
p->date,存放的应该是第二个结点的数据啊,我是这么理解的

难道理解错了,书上也是这么讲的

[ 本帖最后由 whukeming 于 2013-5-28 12:59 编辑 ]
2013-05-28 12:55
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
收藏
得分:10 
回复 3楼 邓士林
第一个结点是不存储数据的,只是方便结点的增减登操作,其实你可以头结点看做0结点,然后一个就是第一个结点了。结构要统一。
2013-05-28 15:57
whukeming
Rank: 2
等 级:论坛游民
帖 子:76
专家分:51
注 册:2008-8-24
收藏
得分:0 
回复 5楼 cuijunchao
那照你的意思,head->date 里面不存在数据吗?

第一段代码,是书里写的,这里把head赋给p,head和p都指向第一个结点,那p->num, p->score输出第一个结点的数据内容;
第二段代码就有出入了, p = pHead->pNext,我就搞不懂,为什么这里是p = pHead->pNext,而不是p = pHead


程序代码:
p = head;

do
    { 
        printf("%ld %5.1f\n", p->num, p->score);
        
        p = p->next;

    }while(p != NULL)


程序代码:
void traverse_list(PNODE pHead)
{
    PNODE p = pHead->pNext;
    
    while (NULL != p)
    {
        printf("%d ", p->data);
        p = p->pNext;
    }
    printf("\n");
    
    return;
}



[ 本帖最后由 whukeming 于 2013-5-29 19:26 编辑 ]
2013-05-29 19:25
whukeming
Rank: 2
等 级:论坛游民
帖 子:76
专家分:51
注 册:2008-8-24
收藏
得分:0 
回复 5楼 cuijunchao
第一个结点不存储数据,你指的是头结点还是首结点?

你指的第一个结点是head所指向的结点吗?

按你说的明白了,就是第一个结点,也就是head所指向的结点不储存数据,空结点,第二个结点开始才是第一个有效结点,对不,
但是根据书里的写法,第一个结点还是存了数据的,两者代码不太一样。

[ 本帖最后由 whukeming 于 2013-5-29 19:37 编辑 ]
2013-05-29 19:27
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
收藏
得分:0 
head 所指的指针就是所谓的头结点,数据域不存储任何东西;head->next才是第一个数据结点。这种结构式比较好的,你说的直接不设头结点也可以正确操作;问题是不管用哪种结构,要统一操作,不要两种混着用,但是建议用带有头结点的,那个更方便操作,你要想别人为什么药这样做,那是有目的的,是实践的出来的,要细细体会,不能只会写两个代码,至于书上的可以参考,但是自己写出来的或许更好,中国出版的书很多也不严谨的。
2013-05-29 22:31
whukeming
Rank: 2
等 级:论坛游民
帖 子:76
专家分:51
注 册:2008-8-24
收藏
得分:0 
回复 8楼 cuijunchao
原来是这样。明白了
2013-05-30 08:20
快速回复:单向链表创建和输出的问题
数据加载中...
 
   



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

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