Drof 2016-12-09 02:26 采纳率: 50%
浏览 1072
已采纳

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

做的是一个带有头结点的单链表,思路是先在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 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; 
    } 
    

    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。