| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5371 人关注过本帖
标题:求链表长度的函数的问题
只看楼主 加入收藏
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:6 
求链表长度的函数的问题
链表建立好之后,对链表求长度,设置了一个求链表长度的函数,但返回值始终为1,很是困惑,望大神指点,感激不尽。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
    int data;
    struct Node * pnext;
}NODE, * PNODE;
PNODE create_list()
{
    PNODE phead=(PNODE)malloc(sizeof(NODE));
    if(phead==NULL)
    {
        printf("内存分配失败,程序终止。\n");
        exit(-1);
    }
    PNODE pnew=(PNODE)malloc(sizeof(NODE));
    if(pnew==NULL)
    {
        printf("内存分配失败,程序终止。\n");
        exit(-1);
    }
    int val,len,i;
    printf("请输入您要建立的链表的长度:");
    scanf("%d",&len);
    PNODE ptail;
    ptail=phead;
    for(i=0;i<len;i++)
    {
        printf("请输入第%d个节点的值:",i+1);
        scanf("%d",&val);
        pnew->data =val;
        ptail->pnext =pnew;
        pnew->pnext =NULL;
        ptail=pnew;
    }
    return phead;
}
int length(PNODE phead)
{
    PNODE p=phead->pnext;
    int n=0;
    while(NULL!=p)
    {
        n++;
        p=p->pnext;
    }
    return n;
}
void traverse_list(PNODE phead,int len)
{
    int i;
    PNODE p=phead->pnext;
    for(i=0;i<len;i++)
    {
        printf("%d ",p->data);
        p=p->pnext ;
    }
    printf("\n");
    return;
}
int main(void)
{
    PNODE phead;
    int len;
    phead=create_list();
    len=length(phead);
    printf("链表的长度是%d\n",len);
    traverse_list(phead,len);
    return 0;
}
程序运行后的结果如下所示:
请输入您要建立的链表的长度:6
请输入第1个节点的值:1
请输入第2个节点的值:2
请输入第3个节点的值:3
请输入第4个节点的值:4
请输入第5个节点的值:5
请输入第6个节点的值:6
链表的长度是1
6
Press any key to continue
搜索更多相关主题的帖子: include 
2013-09-12 20:53
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:3 
看数据结构的书,都有链表实现的,计算长度主要就是不停移动头指针,并判断是否为空。

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-09-12 21:05
youngdavid
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:698
注 册:2012-9-24
收藏
得分:3 
可以看看郝斌的数据结构的视频。
2013-09-12 21:20
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:3 
可以用递归的方法求链表的长度。

♂ 死后定当长眠,生前何须久睡。♀
2013-09-12 21:21
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
可以用递归的方法求链表的长度。
看了下代码,你创建链表的函数写的有问题。给你个链表操作的例子吧。代码如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
using namespace std;
typedef struct node
{
    int data;
    struct node *next;
}*PNODE;
PNODE Create_list(void)
{
    int i;
    int a[]= {1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
    PNODE head=(PNODE)malloc(sizeof(node));
    if(NULL==head)
    {
        printf("内存分配失败,程序终止。\n");
        exit(-1);
    }
    PNODE tail=head;
    tail->next=NULL;
    for(i=0; i<20; i++)
    {
        PNODE pnew=(PNODE)malloc(sizeof(node));
        if(NULL==pnew)
        {
            printf("内存分配失败,程序终止。\n");
            exit(1);
        }
        pnew->data=a[i];
        pnew->next=NULL;
        tail->next=pnew;
        tail=pnew;
    }
    return head;
}
//传入链表的首地址,不是头指针的地址,相当于head->next
int Count_list(PNODE p)//用递归的方法求链表的长度
{
    if(p==NULL) return 0;
    else return (1+Count_list(p->next));
}
int Length_list(PNODE head)
{
    int n=0;
    PNODE p=head;
    if(head==NULL) return 0;
    while(NULL!=p->next)
    {
        n++;
        p=p->next;
    }
    return n;
}
bool Insert_list(PNODE head,int pos,int value)//在pos位置上插入一个值为value的结点
{
    PNODE p=head;
    int i=0;
    while(NULL!=p->next && i<pos-1)
    {
        p=p->next;
        i++;
    }
    if(i>pos-1 && NULL==p)
        return false;

    PNODE pnode=(PNODE)malloc(sizeof(node));
    if(NULL==pnode)
    {
        printf("内存分配失败,程序终止。\n");
        exit(-1);
    }
    pnode->data=value;
    pnode->next=p->next;
    p->next=pnode;
    return true;
}
bool Delete_list(PNODE head,int pos)//删除pos位置上的结点
{
    PNODE p=head;
    int i=0;
    while(NULL!=p->next && i<pos-1)
    {
        p=p->next;
        i++;
    }
    if(i>pos-1 && NULL==p)
        return false;
    PNODE node= p->next;//记录要删除的节点指针
    p->next =node->next;
    node->next=NULL;//将删除的节点的指针置为NULL
    free(node);//释放删除的结点
    return true;
}
void Display_list(PNODE head)//显示链表的内容
{
    PNODE p=head;
    while(NULL!=p->next)
    {
        printf("%d ",p->next->data);
        p=p->next;
    }
}
void Free_list(PNODE head)//释放链表
{
    PNODE f,p=head->next;
    free(head);
    int i=0;
    while(NULL!=p)
    {
        i++;
        printf("%d ",p->data);
        f=p->next;
        free(p);//释放链表中的结点
        p=f;
    }
    printf("\n%d个指针全部释放完毕!\n\n",i);
}
int main(void)
{
    PNODE head=Create_list();//创建链表并返回链表的头指针

    printf("创建的链表内容如下:\n");

    Display_list(head);

    printf("\n链表的长度为:%d",Count_list(head->next));

    printf("\n链表中结点的个数为:%d\n",Length_list(head));

    printf("\n插入结点之后的链表内容如下:\n");

    Insert_list(head,7,7);//在位置7的地方插入结点值为7的结点

    Insert_list(head,13,72);

    Insert_list(head,15,73);

    Insert_list(head,17,74);

    Insert_list(head,19,75);

    Insert_list(head,23,76);

    Display_list(head);

    printf("\n链表的长度为:%d",Count_list(head->next));

    printf("\n链表中结点的个数为:%d\n",Length_list(head));

    printf("\n删除结点之后的链表内容如下:\n");

    Delete_list(head,11);//删除位置11处的结点

    Display_list(head);

    printf("\n链表的长度为:%d",Count_list(head->next));

    printf("\n链表中结点的个数为:%d\n\n",Length_list(head));

    Free_list(head);//释放链表

    return 0;
}



[ 本帖最后由 303770957 于 2013-9-13 02:41 编辑 ]

♂ 死后定当长眠,生前何须久睡。♀
2013-09-12 21:30
liufashuai
Rank: 9Rank: 9Rank: 9
来 自:冥界-魔域-魂殿
等 级:蜘蛛侠
威 望:1
帖 子:370
专家分:1374
注 册:2012-6-22
收藏
得分:3 
大哥,你这明显不是链表长度函数出问题了

你看看你创建链表时候怎么弄的,好像就前面两个申请空间了,循环里面就没有申请空间
它怎么连起来。根据你求链表长度的函数,就应该是1;

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。






2013-09-12 23:36
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
如楼上所述,链表建立出了问题,应该把动态分配的pnew存放在for循环里,这样就是正确的了
for(i=0;i<len;i++)
{

PNODE pnew=(PNODE)malloc(sizeof(NODE));
    if(pnew==NULL)
    {
        printf("内存分配失败,程序终止。\n");
        exit(-1);
    }
............

...........

...........
}
2013-09-13 10:08
快速回复:求链表长度的函数的问题
数据加载中...
 
   



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

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