【问题标题】:Inserting at the end of queue in C在C中的队列末尾插入
【发布时间】:2015-11-21 18:10:32
【问题描述】:

我正在尝试在队列末尾插入节点并面临以下错误。这是编译代码时的简单基本错误,但让我的生活变得艰难。

#include<stdio.h>
#include<stdlib.h>

typedef struct UNIX  {

char str[20];

struct UNIX *next;
}examp;

examp *head=NULL;

int insert_last(char *s)

{
    examp *new,*slide;
    slide=head;
    new = (examp *)malloc(sizeof(examp));

      if(!new)
           return(EXIT_FAILURE);
    while(slide->next!=NULL)
        slide=slide->next;
    slide->next=new;
    new->str=s;
    new->next=NULL;
    if(head==NULL)
    {   head=new;
        return 1;
    }
    return 1;
}
void display (void);
int main()

{


insert_last("hello ");
insert_last("how ");
insert_last("have ");
insert_last("you ");
insert_last("been ");
insert_last("! ");
display();

}

void display(void)
{
    examp *slide;
    slide=head;
    while(slide->next!=NULL)
    { printf("%s   ",slide->str);
       slide=slide->next;
    }

}

错误:stack_queue.c:27:10:错误:赋值给数组类型的表达式 新->str=s;

更新:使用 strncpy 解决了错误,但代码未按预期工作并意外停止。

【问题讨论】:

    标签: c linked-list stack queue


    【解决方案1】:

    您不能分配给这样的静态数组。考虑改用strcpystrncpy 来复制字符串的内容。

    【讨论】:

      【解决方案2】:

      您不能将字符串分配给数组!数组有自己的内存,可以写入或读取数组中的元素,但不能分配地址。

      您最终可以将字符串s 的内容复制到数组中:

      strncpy(new->str, s, 19);
      new->str[19] = '\0';    //Close the string in case of overflow.
      

      我们使用 strncpy 将复制的字符限制为数组大小(19 个字符 + 结尾 '\0')。

      【讨论】:

      • 但是输出没有按预期进行。
      • @theartist33 什么不符合预期?字符串内容是否正确?请参阅我对答案的更新。
      【解决方案3】:

      你可以试试。仅将new-&gt;str=s; 中的替换为strcpy(new-&gt;str, s);(即s 将被复制到new-&gt;str

      #include<stdio.h>
      #include<stdlib.h>
      
      typedef struct UNIX  {
      
      char str[20];
      
      struct UNIX *next;
      }examp;
      
      examp *head=NULL;
      
      int insert_last(char *s)
      
      {
          examp *new,*slide;
          slide=head;
          new = (examp *)malloc(sizeof(examp));
      
            if(!new)
                 return(EXIT_FAILURE);
          while(slide->next!=NULL)
              slide=slide->next;
          slide->next=new;
          strcpy(new->str, s);
          new->next=NULL;
          if(head==NULL)
          {   head=new;
              return 1;
          }
          return 1;
      }
      void display (void);
      int main()
      
      {
      
      
      insert_last("hello ");
      insert_last("how ");
      insert_last("have ");
      insert_last("you ");
      insert_last("been ");
      insert_last("! ");
      display();
      
      }
      
      void display(void)
      {
          examp *slide;
          slide=head;
          while(slide->next!=NULL)
          { printf("%s   ",slide->str);
             slide=slide->next;
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        如前所述,您必须使用 strcpy(或 strncpy)来分配字符串。

        除此之外,我想提两件事:

        1. 不要忘记释放 malloc 分配的内存。创建一个释放单个节点的方法(示例),然后您还可以提供一个方法来销毁整个列表。

        2. 我建议将变量重命名为 new 以避免混淆(纯 C 编译器可能会处理它,但 C/C++ 编译器很可能会遇到麻烦)。

        考虑到您的更新: 看看下面这行

        while(slide->next!=NULL)
        

        此时幻灯片甚至不存在(它为NULL),仍然对指针执行操作。这就是程序崩溃的原因。

        【讨论】:

        • 我现在正在通过 free(node) 释放内存并将 'new' 更改为 'node' ,仍然不是解决方案
        • 您正试图访问空指针上的元素。这就是崩溃的原因。
        【解决方案5】:

        您的错误在于第一次调用insert_last("hello ")

        int insert_last(char *s)
        {
        examp *new,*slide;
        slide=head;
        new = (examp *)malloc(sizeof(examp));
        
          if(!new)
               return(EXIT_FAILURE);
        while(slide->next!=NULL)
            slide=slide->next;
        

        第一次调用的时候head是NULL,所以slide就变成NULL了,但是你不去检查,在里面调用

        while(slide->next!=NULL)
        

        第一个函数调用的幻灯片为空

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-01
          • 1970-01-01
          • 2011-08-13
          • 2011-10-10
          • 2019-11-30
          • 1970-01-01
          • 2013-10-30
          • 1970-01-01
          相关资源
          最近更新 更多