我正在编写一个程序,将数据插入链表并打印出来。
链接列表.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;
}