c-在链表中插入字符串时出现问题



我正在编写一个程序,将数据插入链表并打印出来。

链接列表.c

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
struct node 
{
  char *data;
  struct node *next;
};
void insert(struct node** head_ref,char *new_data)
{
struct node* new_node = (struct node*) malloc(sizeof(struct node));
struct node *last = *head_ref;
strcpy(new_node->data,new_data);
new_node->next = NULL;
if (*head_ref == NULL)
{
   *head_ref = new_node;//assigning head node
   return;
}
while (last->next != NULL)
    last = last->next;//this helps to traverse to last node
last->next = new_node;
return;
}

void printList(struct node *node)//function to print the linked list
{
  while (node != NULL)
  {
   printf(" %s ", node->data);
   node = node->next;
  }
}

int main() {
   int t;
   char datas[1000];
   scanf("%d",&t);
   struct node* head=NULL;
   int i;
   for(i=0;i<t;i++)
   {
      scanf("%s",datas);//this data should be added into the linkedlist
      insert(&head,datas);
   }
   printList(head);
  return 0;
 }

这个程序适用于integer,但如果我使用字符串,它会显示stdout上没有响应我已经试着调试代码好几个小时了。

您的代码给出了未定义的行为。

请查看strcpy()的文档。

长话短说,strcpy()要求destination(您的new_node->data)是一个已分配的char数组,但您尚未为其分配数据,并且您正在写入未定义(和未分配)的内存。

为了克服这个问题,可以为新字符串动态分配空间(不要忘记在释放节点时释放它),也可以将data设置为char[]而不是char*

此外,只需记住缓冲区溢出的弱点。既然它看起来像是教育目的代码,那就想想吧——不要试图解决它,IMO.

您错过了内存分配,请尝试以下操作:

void insert(struct node** head_ref,char *new_data)
{
struct node* new_node = (struct node*) malloc(sizeof(struct node));
struct node *last = *head_ref;
// you should allocate memory because you use data as char *
new_node->data = malloc(strlen(new_data)+1); 
/* you can use new_node->data = strdup(new_data);  
instead of new_node->data = malloc(strlen(new_data)); and strcpy(new_node->data,new_data); 
because strdup allocate and copy string with exact size */
strcpy(new_node->data,new_data); 
new_node->next = NULL;
if (*head_ref == NULL)
{
   *head_ref = new_node;//assigning head node
   return;
}
while (last->next != NULL)
    last = last->next;//this helps to traverse to last node
last->next = new_node;
return;
}

相关内容

  • 没有找到相关文章

最新更新