| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1672 人关注过本帖
标题:我这个单链表的创建和遍历哪里有错 总是奔溃
只看楼主 加入收藏
cg12345789
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-2-1
收藏
 问题点数:0 回复次数:14 
我这个单链表的创建和遍历哪里有错 总是奔溃
#include <stdio.h>
#include <stdlib.h>

#define Error 0

typedef struct Node
{
    int data;
    struct Node * Next;
}Node;

//链表的创建
void create_list(Node * p)
{
    int data;
    Node * tail;//尾指针 永远指向最后一个节点;
    Node * node;

    p = (Node*)malloc(sizeof(Node));
    //tail = (Node*)malloc(sizeof(Node));
    if( p == NULL )
    {
        printf("内存创建失败!");
        return Error;
    }

    p->Next = tail;
    tail->Next = NULL;

    //p->Next = NULL;
    //tail = p;
    while(1)
    {
        printf("输入数据: 输入0结束\n");
        scanf("%d",&data);
        if(data != 0)
        {
            node = (Node*)malloc(sizeof(Node));
            if( node == NULL )
            {
                printf("内存创建失败!");
                return Error;
            }
            node->data = data;

            tail->Next = node;
            node->Next = NULL;
            tail = node;
        }
        else
        {
            return 1;
        }
    }

}

//链表的遍历
void traverse_list(Node * head)
{
    Node * p;
    p = head;
    while(1)
    {
        if(p->Next == NULL)
        {
            printf("为空表");
            return 0;
        }

        printf("数据为:%d\n",p->data);
        p = p->Next;
    }
    printf("OK");
}


int main()
{
    Node * p;
    create_list(p);
    traverse_list(p);

    return 0;
}


[此贴子已经被作者于2017-2-1 19:14编辑过]

搜索更多相关主题的帖子: include return 
2017-02-01 19:13
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
尾指针不常见耶~可以不用尾指针么~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-01 19:19
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 九转星河
对上楼作出补充~原来尾指针是指创建链表时的p1或者p2~不过在创建链表函数里面创建完毕后就释放了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-01 19:25
cg12345789
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-2-1
收藏
得分:0 
回复 3楼 九转星河
但是和我更想知道我这个代码错到哪里了
2017-02-01 19:28
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
   if( p == NULL )
    {
        printf("内存创建失败!");
        return Error;
    }

    p->Next = tail;
    tail->Next = NULL;

这里~tail还没分配空间~还不能通过tail来引用next~感觉楼主写得和我见过课本例子不太相同~~九九就不敲修改代码了~可以自己试试动手修改一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-01 19:29
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
可以试试在把tail->Next=NULL改成tail=NULL~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-01 19:35
cg12345789
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-2-1
收藏
得分:0 
回复 5楼 九转星河
但是我改成这样也是一样的错啊
    p = (Node*)malloc(sizeof(Node));
    tail = (Node*)malloc(sizeof(Node));
2017-02-01 19:35
cg12345789
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-2-1
收藏
得分:0 
undefined
这样尾指针不就是空了吗 尾指针不是要指向最后一个节点吗
2017-02-01 19:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
我初学链表写的~仅供参考~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{
    int num;
    int score;
    struct Student *next;
};
int n=0;
void  creat(struct Student *head,struct Student *p1,struct Student*p2);
struct Student *creat_head()
{
    struct Student *head;
    struct Student *p1,*p2;
    head=NULL;
    p1=p2=malloc(LEN);
    scanf("%d%d",&p1->num,&p1->score);
    p1->next=p2->next=NULL;
    if (!p1->num) return (NULL);
    creat(head,p1,p2);
    head=p1;
    return (head);
}
void  creat(struct Student *head,struct Student *p1,struct Student*p2)
{
    while (p1->next!=NULL)
        p1=p1->next;
    p2=p1;
    do
    {   
        n++;
        if (n==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=malloc(LEN);
        scanf("%d%d",&p1->num,
        &p1->score);
    }while(p1->num);
    p2=NULL;
}
void input(struct Student *head)
{
    struct Student *p;
    p=head;
    while (p!=NULL)
    {
        printf("%d %d\n",p->num,p->score);
        p=p->next;
    }
}
int main()
{
    struct Student *creat_head();
    struct Student *head;
    head=creat_head();
    input(head);
}



[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-01 19:40
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
除了前几个答主指出的错误外,题主还有两处错误:
1:对void函数给出了返回值,这个错误可能在gcc里是warning,但在vc里是error,不能通过编译
2:函数void create_list(Node * p)无法得到链表头指针值,要修改指针值,需要使用void create_list(Node ** p),即使用指针的指针的参数传值
整个代码修改如下即运行正常:
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define Error 0

typedef struct Node
{
    int data;
    struct Node * Next;
}Node;

//链表的创建
void create_list(Node ** p)
{
    int data;
    Node * tail;//尾指针 永远指向最后一个节点;
    Node * node,*pp;
    pp=*p;
    pp = (Node*)malloc(sizeof(Node));
    //tail = (Node*)malloc(sizeof(Node));
    if( pp == NULL )
    {
        printf("内存创建失败!");
        return ;
    }
    *p=pp;
    pp->Next = tail;
    tail = pp;

    //p->Next = NULL;
    //tail = p;
    while(1)
    {
        printf("输入数据: 输入0结束\n");
        scanf("%d",&data);
        if(data != 0)
        {
            node = (Node*)malloc(sizeof(Node));
            if( node == NULL )
            {
                printf("内存创建失败!");
                return ;
            }
            node->data = data;

            tail->Next = node;
            node->Next = NULL;
            tail = node;
        }
        else
        {
            return;
        }
    }

}

//链表的遍历
void traverse_list(Node * head)
{
    Node * p;
    p = head;
    while(1)
    {
        if(p->Next == NULL)
        {
            printf("为空表");
            return ;
        }

        printf("数据为:%d\n",p->data);
        p = p->Next;
    }
    printf("OK");
}


int main()
{
    Node * p;
    create_list(&p);
    traverse_list(p);

    return 0;
}
收到的鲜花
  • 九转星河2017-02-01 20:03 送鲜花  10朵   附言:我很赞同
2017-02-01 19:49
快速回复:我这个单链表的创建和遍历哪里有错 总是奔溃
数据加载中...
 
   



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

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