在C中插入队列末尾

时间:2015-08-27 11:21:37

标签: c linked-list stack queue

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

#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:错误:赋值给具有数组类型的表达式   新建 - &GT; STR = S;

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

你可以尝试一下。只有new->str=s;替换为strcpy(new->str, s);(即。s将被复制到new->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;
    }

}

答案 3 :(得分:0)

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

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

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

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

  3. 考虑您的更新: 看一下以下一行

    while(slide->next!=NULL)
    

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

答案 4 :(得分:0)

您的错误出现在第一个电话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)

对于第一个函数调用,幻灯片为空