| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 799 人关注过本帖
标题:单向链表程序 求助
只看楼主 加入收藏
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
单向链表程序 求助
程序编译没有问题   但是没有办法运行 【平台是VC6.0】
程序代码:
#include<stdio.h>
struct node
{
    int data;
    node *link;
};
struct list
{
    node *first,*last;
};
int insert(list a,int num)
{
    node *p=a.first;
    while(p!=NULL)    p=p->link;
    node *m;
    m->data=num;
    m->link=NULL;
    if(a.first==NULL)
    {
        m->link=a.first;
        if(a.first==NULL)    a.last=m;
        a.first=m;
    }
    else
    {
        m->link=p->link;
        if(p->link==NULL)    a.last=m;
        p->link=m;
    }
    return 0;
}

int show(const list a)
{
    node *p=a.first;
    while(p!=NULL)
    {
        printf("%d   ",&p->data);
        p=p->link;
    };
    return 0;
}

int main()
{
    list a;
    a.first=a.last=NULL;
    for(int i=0;i<4;i++)
        insert(a,i+1);
    show(a);
    return 0;
}




[ 本帖最后由 韭菜 于 2010-9-27 02:18 编辑 ]
搜索更多相关主题的帖子: 链表 
2010-09-27 01:42
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:2 
你都没用MALLOC那些链表怎么形成。。。

清风拂暮(木)
2010-09-27 11:17
李云博君羽
Rank: 1
等 级:新手上路
帖 子:3
专家分:8
注 册:2010-9-27
收藏
得分:1 
回复 2楼 清风拂晓
对要申请空间malloc
2010-09-27 11:57
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
收藏
得分:0 
经过2楼提醒  修改如下   但是  能不能请教一下  为什么一定要malloc呢      
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    node *link;
};
struct list
{
    node *first,*last;
};
int show(list a);
int insert(list a,int num)
{
    node *p=a.first;
    while(p!=NULL)    p=p->link;
    node *m=(struct node *)malloc(sizeof(struct node));
    m->data=num;
    m->link=NULL;
    if(a.first==NULL)
    {
        a.last=m;
        a.first=m;
    }
    else
    {
        m->link=p->link;
        if(p->link==NULL)    a.last=m;
        p->link=m;
    }
    show(a);
    return 0;
}
int show(list a)
{
    node *p=a.first;
    while(p!=NULL)
    {
        printf("%d   ",&p->data);
        p=p->link;
    };
    return 0;
}
int main()
{
    list a;
    a.first=a.last=NULL;
    for(int i=0;i<4;i++)
    {
        insert(a,i+1);
    }
    show(a);
    return 0;
}


执行结果为:    1 2 3 4  Press any key to continue
这不是我要的结果啊  
我要的是 1    1 2    1 2 3   1 2 3 4     不停的更新显示链表

求助
2010-09-27 12:15
李云博君羽
Rank: 1
等 级:新手上路
帖 子:3
专家分:8
注 册:2010-9-27
收藏
得分:2 
但是,好像不行,能说一下你的思路吗,我新手。只是刚刚学到数据结构,我看老师每次插入的时候都提到了要用malloc申请一个空间。】int insert(list a,int num)你的list a "list"并没有用typedef命名。这是我的想法。不知道对不?
2010-09-27 12:17
青衣修罗
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:22
专家分:129
注 册:2010-9-16
收藏
得分:15 
以下是引用韭菜在2010-9-27 12:15:32的发言:

经过2楼提醒  修改如下   但是  能不能请教一下  为什么一定要malloc呢      
 
#include
#include
struct node
{
    int data;
    node *link;
};
struct list
{
    node *first,*last;
};
int show(list a);
int insert(list a,int num)
{
    node *p=a.first;
    while(p!=NULL)    p=p->link;
    node *m=(struct node *)malloc(sizeof(struct node));
    m->data=num;
    m->link=NULL;
    if(a.first==NULL)
    {
        a.last=m;
        a.first=m;
    }
    else
    {
        m->link=p->link;
        if(p->link==NULL)    a.last=m;
        p->link=m;
    }
    show(a);
    return 0;
}
int show(list a)
{
    node *p=a.first;
    while(p!=NULL)
    {
        printf("%d   ",&p->data);
        p=p->link;
    };
    return 0;
}
int main()
{
    list a;
    a.first=a.last=NULL;
    for(int i=0;i<4;i++)
    {
        insert(a,i+1);
    }
    show(a);
    return 0;
}


执行结果为:    1 2 3 4  Press any key to continue
这不是我要的结果啊  
我要的是 1    1 2    1 2 3   1 2 3 4     不停的更新显示链表

求助
我不相信你这段代码可以输出你所说的结果,你用什么编译器简直太神奇了啊。
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *link;
};
struct list
{
    struct node *first,*last;
};
int show(struct list a);
int insert( struct list* a,int num)//这儿是需要传指针的
{
    struct node *p=a->first;
    //while(p!=NULL)    p=p->link;//这是干什么的?
    struct node *m=(struct node *)malloc(sizeof(struct node));
    m->data=num;
    m->link=NULL;
    if(a->first==NULL)
    {
        a->last=m;
        a->first=m;
    }
    else//你原来写的要实现什么?
    {
       (a->last)->link=m;
        a->last=m;
        m->link=NULL;
    }
    show(*a);
    return 0;
}
int show(list a)
{
    struct node *p=a.first;
    while(p!=NULL)
    {
        printf("%d",p->data);
        p=p->link;
    };
    printf("  ");
    return 0;
}
int main()
{
    struct list a;
    a.first=a.last=NULL;
    for(int i=0;i<4;i++)
        insert(&a,i+1);
    system("pause");
    return 0;
}

试试这个吧,可以实现你的要求

[ 本帖最后由 青衣修罗 于 2010-9-27 13:15 编辑 ]

程序就是:任何有目的的、预想好的动作序列。
2010-09-27 13:13
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
收藏
得分:0 
谢谢大家  尤其是 青衣修罗   谢谢  
我再看看文件头
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *link;
};
struct list
{
    struct node *first,*last;
};
int show(struct list a);
int insert( struct list* a,int num)//这儿是需要传指针的,受教了 
{
    struct node *p=a->first;
    //while(p!=NULL)    p=p->link;//这是干什么的?  用来检错的
    struct node *m=(struct node *)malloc(sizeof(struct node));
    m->data=num;
    m->link=NULL;
    if(a->first==NULL)
    {
        a->last=m;
        a->first=m;
    }
    else//你原来写的要实现什么?   想插入表头的 
    {
       (a->last)->link=m;
        a->last=m;
        m->link=NULL;
    }
    show(*a);
    return 0;
}
int show(list a)
{
    struct node *p=a.first;
    while(p!=NULL)
    {
        printf("%d",p->data);
        p=p->link;
    };
    printf("  ");
    return 0;
}
int main()
{
    struct list a;
    a.first=a.last=NULL;
    for(int i=0;i<4;i++)
        insert(&a,i+1);
    system("pause");
    return 0;
}
2010-09-27 14:02
韭菜
Rank: 2
等 级:论坛游民
帖 子:51
专家分:94
注 册:2010-9-26
收藏
得分:0 
现在是从表头开始添加  其实只是改动了一点点   
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *link;
};
struct list
{
    struct node *first,*last;
};
int show(struct list a);
int insert( struct list* a,int num)
{
    struct node *p=a->first;
    //while(p!=NULL)    p=p->link;
    struct node *m=(struct node *)malloc(sizeof(struct node));
    m->data=num;
    m->link=NULL;
    if(a->first==NULL)
    {
        a->last=m;
        a->first=m;
    }
    else
    {
       a->first=m;
        m->link=p;
    }
    show(*a);
    return 0;
}
int show(list a)
{
    struct node *p=a.first;
    while(p!=NULL)
    {
        printf("%d",p->data);
        p=p->link;
    };
    printf("  \n");
    return 0;
}
int main()
{
    struct list a;
    a.first=a.last=NULL;
    for(int i=0;i<4;i++)
        insert(&a,i+1);
    system("pause");
    return 0;
}


大家看看  能不能不是新建指针  而是结构体  行不

[ 本帖最后由 韭菜 于 2010-9-27 15:30 编辑 ]
2010-09-27 14:53
青衣修罗
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:22
专家分:129
注 册:2010-9-16
收藏
得分:0 
居然还不给结贴,从头插就没那么麻烦了,连空都不用判断的
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *link;
};
struct list
{
    struct node *first,*last;
};
int show(struct list a);
int insert( struct list* a,int num)//这儿是需要传指针的
{
    //struct node *p=a->first;
    //while(p!=NULL)    p=p->link;//这是干什么的?
    struct node *m=(struct node *)malloc(sizeof(struct node));
    m->data=num;
    m->link=a->first;
    a->first=m;
   /* if(a->first==NULL)
    {
        a->last=m;
        a->first=m;
  
    else//你原来写的要实现什么?
    {
       (a->last)->link=m;
        a->last=m;
        m->link=NULL;
    }*/
    show(*a);
    return 0;
}
int show(list a)
{
    struct node *p=a.first;
    while(p!=NULL)
    {
        printf("%d",p->data);
        p=p->link;
    };
    printf("  ");
    return 0;
}
int main()
{
    struct list a;
    a.first=a.last=NULL;
    for(int i=0;i<4;i++)
        insert(&a,i+1);
    system("pause");
    return 0;
}
至于你提出的新建指针还是新建结构体,这就不是个问题,你要明白 struct node *m=(struct node *)malloc(sizeof(struct node));这一句实现的是什么,malloc()是从自由存储区,也就是堆空间申请一块sizeof(struct node)大小的内存,注意malloc返回值为void* 所以需要(struct node *)强制类型转换,然后这段内存区的数据就是一个struct node,而且重要的是这段内存在函数调用之后不会自动释放直到你显式调用free,你直接在函数里面定义struct node m;函数调用结束m的生命周期也就结束存储空间被释放掉了,所以没意义。另外你如果不喜欢用指针你接下来完全可以用*m来操作嘛。指针多强大啊!满意就赶紧给分哈哈


程序就是:任何有目的的、预想好的动作序列。
2010-09-27 15:42
rard
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-9-28
收藏
得分:0 
回复 9楼 青衣修罗
原文:int insert( struct list* a,int num)//这儿是需要传指针的

请教:如果不用指针,即改成int insert(struct list a,int num),运行后的结果是1 2 3 4 ,而不是1 12 123 1234 ,请教一下为什么?


程序如下:
#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *link;
};

struct list
{
    struct node *first,*last;
};

void show(struct list a)
{
    struct node *p=a.first;
    while(p!=NULL)
    {
        printf("%d",p->data);
        p=p->link;
    }
    printf(" ");
}

void insert(struct list a,int num)
{
    struct node *m=(struct node *)malloc(sizeof(struct node));
    m->data=num;
    m->link=NULL;
    if(a.first==NULL)
    {
        a.first=m;
        a.last=m;
    }
    else
    {
        a.last->link=m;
        a.last=m;
    }
    show(a);
}

void main()
{
    int i;
    struct list a;
    a.first=NULL;
    a.last=NULL;
    for(i=0;i<4;i++)
        insert(a,i+1);
}
2010-09-28 20:28
快速回复:单向链表程序 求助
数据加载中...
 
   



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

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