WDMX980412njlg
Drof
采纳率50%
2016-12-09 02:26 阅读 1.1k
已采纳

大家帮忙看一下为什么会出错?

做的是一个带有头结点的单链表,思路是先在main中定义头结点,然后在create函数中构造首元结点,接着在insert函数中判断输出是否结束(以$作为结束标志)。

#include <stdio.h>
#include <malloc.h>
#define ElemType int
#define OVERFLOW 0
#define OK 1
typedef struct node{
    ElemType data;
    struct node *next;
}list;
int create(list *head){
    list *t;
    t=(list*)malloc(sizeof(list));
    if(!t){
        printf("\n分配空间失败!");
        return (OVERFLOW);
    }
    head = t;
    int x;
    printf("\nenter a number(end with $):");
    scanf("%d",&x);
    if(x!='$'){
        t=(list*)malloc(sizeof(list));
        t->data = x;
        t->next = NULL;
        head->next = t;
    }
    return OK;
}
int insert(list *head){
    list *t,*m,*n;//m和n表示相邻的两个节点,用于与节点比较大小,然后插入 
    int x;
    scanf("%d",&x);
    while(x!='$'){
        t=(list*)malloc(sizeof(list));
        if(!t) return(OVERFLOW);
        t->data = x;
        t->next = NULL;
        m = head->next;//这里调试出现错误 
        n = head; 
        if(t->data <= m->data){ 
            n->next = t;
            t->next = m;
        }
        else{
            while(1){
                m = m->next;
                n = n->next;
                if(t->data<=m->data){
                    n->next = t;
                    t->next = m;
                    break;
                }
                if(m->next==NULL) break;
            }
            if(m->next==NULL)
                m->next = t;
        }
        scanf("%d",x); 
    }
    return (OK);
}
int main(void){
    //创建一个有头结点的链表 
    printf("create a list");
    int i;
    list *head = NULL;
    i = create(head);
    if(i) insert(head);
    return 0; 
} 

然后我把create的返回值类型改成list*,返回head,然后再把main改一下就不出错了,这是为什么呢?
求大神解答,刚入门,轻喷- -
谢谢!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

7条回答 默认 最新

  • 已采纳
    YXTS122 YXTS122 2016-12-11 05:03

    帮你又改了一下:

     #include <stdio.h>
    #include <malloc.h>
    #define ElemType int
    #define OVERFLOW 0
    #define OK 1
    typedef struct node
    { 
    ElemType data; 
    struct node *next;
    }list;
    list* create(list *head)
    {
        list *t; 
        t=(list*)malloc(sizeof(list));
        if(!t)
        { 
        printf("\n分配空间失败!"); 
        return (OVERFLOW); 
        }
        head = t; 
        int x; 
        printf("\nenter a number(end with $):"); 
        scanf("%d",&x);
         if(x!='$')
         {
            t=(list*)malloc(sizeof(list)); 
            t->data = x;
            t->next = NULL;
             head->next = t;
         }
         return head;
    }
    void insert(list *head)
    {
        list *t,*m,*n;
    //m和n表示相邻的两个节点,用于与节点比较大小,然后插入 
        int x;
        scanf("%d",&x); 
        while(x!=0)
        {
            t=(list*)malloc(sizeof(list)); 
            if(!t)
            return;
            t->data = x; 
            t->next = NULL; 
            m = head->next;
            //这里调试出现错误 
            n = head;
            if(t->data <= m->data)
            {
                n->next = t;
                t->next = m;
            }
            else
            {
                while(1)
                {
                    //你这里注意先判断一下就好了
                    if (m->next==NULL)
                         break;
                    m = m->next;
                    n = n->next; 
                    if(t->data<=m->data)
                    {
                        n->next = t;
                        t->next = m;
                        break; 
                    }
                }
            /*  if(m->next==NULL)
                     m->next=t;*/
                if(m->data<t->data) 
                   m->next = t; 
            }
            scanf("%d",&x);
       }
    }
    void output(list *head)
    {
        list *p;
        p=head->next;
        while (p)
        {
            printf("%d ",p->data);
            p=p->next;
        }
    }
    int main(void)
    {
         //创建一个有头结点的链表 
         printf("create a list");
         list *head = NULL;
         head = create(head);
         insert(head);
         output(head);
         return 0; 
    } 
    

    图片说明

    点赞 1 评论 复制链接分享
  • YXTS122 YXTS122 2016-12-09 03:07

    楼主,添加个输出函数,把链表输出,看看对不对

    点赞 评论 复制链接分享
  • YXTS122 YXTS122 2016-12-09 03:55

    代码中有个scanf("%d",x);少了&,应该为scanf("%d",&x);

    点赞 评论 复制链接分享
  • YXTS122 YXTS122 2016-12-09 09:47

    帮你修改了一下:

     #include <stdio.h>
    #include <malloc.h>
    #define ElemType int
    #define OVERFLOW 0
    #define OK 1
    typedef struct node
    { 
    ElemType data; 
    struct node *next;
    }list;
    list* create(list *head)
    {
        list *t; 
        t=(list*)malloc(sizeof(list));
        if(!t)
        { 
        printf("\n分配空间失败!"); 
        return (OVERFLOW); 
        }
        head = t; 
        int x; 
        printf("\nenter a number(end with $):"); 
        scanf("%d",&x);
         if(x!='$')
         {
            t=(list*)malloc(sizeof(list)); 
            t->data = x;
            t->next = NULL;
             head->next = t;
         }
         return head;
    }
    void insert(list *head)
    {
        list *t,*m,*n;
    //m和n表示相邻的两个节点,用于与节点比较大小,然后插入 
        int x;
        scanf("%d",&x); 
        while(x!=0)
        {
            t=(list*)malloc(sizeof(list)); 
            if(!t)
            return;
            t->data = x; 
            t->next = NULL; 
            m = head->next;
            //这里调试出现错误 
            n = head;
            if(t->data <= m->data)
            {
                n->next = t;
                t->next = m;
            }
            else
            {
                while(1)
                {
                    m = m->next;
                    n = n->next; 
                    if(t->data<=m->data)
                    {
                        n->next = t;
                        t->next = m;
                        break; 
                    }
                    if (m->next==NULL)
                         break;
                }
            /*  if(m->next==NULL)
                     m->next=t;*/
                if(m->data<t->data) 
                   m->next = t; 
            }
            scanf("%d",&x);
       }
    }
    void output(list *head)
    {
        list *p;
        p=head->next;
        while (p)
        {
            printf("%d ",p->data);
            p=p->next;
        }
    }
    int main(void)
    {
         //创建一个有头结点的链表 
         printf("create a list");
         list *head = NULL;
         head = create(head);
         insert(head);
         output(head);
         return 0; 
    } 
    

    图片说明

    点赞 评论 复制链接分享
  • WDMX980412njlg Drof 2016-12-10 18:32
      if(x!=0){
            t=(list*)malloc(sizeof(list));
            t->data = x;
            t->next = NULL;
            if(x > head->next->data){
                head->next->next = t;
            } else{
                t->next = head->next;
                head->next = t;
            }
        }
        scanf("%d",&x);
    

    因为第一次进入这个函数的时候只有一个首元节点,所以m=m->next;之后的m->data是非法的

    点赞 评论 复制链接分享
  • WDMX980412njlg Drof 2016-12-11 01:42

    图片说明
    图片说明

    点赞 评论 复制链接分享
  • WDMX980412njlg Drof 2016-12-11 01:42

    我输入的是1 2 3 4 5 0

    点赞 评论 复制链接分享

相关推荐