| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1223 人关注过本帖
标题:在建立链表的时候一定要构造一个尾指针吗?
只看楼主 加入收藏
snailqiu
Rank: 2
等 级:论坛游民
帖 子:59
专家分:45
注 册:2007-9-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
在建立链表的时候一定要构造一个尾指针吗?
今天看了一段郝斌的C视频,里面在介绍链表的时候大致是这样说的(最简单的单链表):先构造两个指针,一个头指针 ,一个尾指针,都指向一个节点1。再用malloc动态构造一个节点2,用一个pnew指向它,然后把节点1的指针域里填充为pnew,节点1就指向了节点2,再把节点2的数据域填充一个数据,接着把节点2的指针域赋为NULL,最后把pnew赋值给尾指针。链表就造好了。

可是,一开始为什么要用两个指针(一个头指针,一个尾指针),只用一个头指针不可以吗?

头指针指向节点1,pnew指向节点2,让节点1的指针域里存pnew,节点1就指向了节点2,然后在节点2的数据域填充数据,最后把节点2的指针域赋为NULL。这样不也是可以的吗?
为什么还要一个尾指针呢?

下面是郝斌的代码。大家看看,是不是那个 pTail有点多余呢?

程序代码:
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

struct Node
{
    int data; //数据域
    struct Node * pNext; //指针域
};

//函数声明
struct Node * create_list(void);
void traverse_list(struct Node *);

int main(void)
{
    struct Node * pHead = NULL; 

    pHead = create_list();  //create_list()功能:创建一个非循环单链表,并将该链表的头结点的地址付给pHead
    traverse_list(pHead);
    
    return 0;
}

struct Node * create_list(void)
{
    int len;  //用来存放有效节点的个数
    int i;
    int val; //用来临时存放用户输入的结点的值

    //分配了一个不存放有效数据的头结点
    struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));
    if (NULL == pHead)
    {
        printf("分配失败, 程序终止!\n");
        exit(-1);
    }
    struct Node * pTail = pHead;  //这里的pTail是不是有点多余
    pTail->pNext = NULL;

    printf("请输入您需要生成的链表节点的个数: len = ");
    scanf("%d", &len);
    
    for (i=0; i<len; ++i)
    {
        printf("请输入第%d个节点的值: ", i+1);
        scanf("%d", &val);
        
        struct Node * pNew = (struct Node *)malloc(sizeof(struct Node));
        if (NULL == pNew)
        {
            printf("分配失败, 程序终止!\n");
            exit(-1);  //终止程序
        }
        pNew->data = val;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
    
    return pHead;
}

void traverse_list(struct Node * pHead)
{
    struct Node * p = pHead->pNext;

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

搜索更多相关主题的帖子: 动态 
2016-03-10 17:16
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:14 
pTail你理解为尾指针是错的,它就是一个临时用的指针,不要看表面的意思,用它就不会动头指针的位置。

   唯实惟新 至诚致志
2016-03-10 18:29
快速回复:在建立链表的时候一定要构造一个尾指针吗?
数据加载中...
 
   



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

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