我试图找出如何使用单链表创建数据库。我想保留一个节点,例如1个客户端,几个项目无法弄清楚,就像3天我现在应该怎么做,这是我尝试这样做的一个例子。试图在客户端内嵌套项目列表,但也失败了。因此,如果有人愿意提供示例或准确说明我应该在此代码中纠正什么,或者可能为我的问题提供更好的答案,那就太棒了,谢谢。
#include <stdio.h>
#include <stdlib.h>
struct item
{
char item_name[30];
struct item *next;
};
struct client
{
char name[30];
char last_name[30];
struct client *next;
};
struct node
{
int NodeNr;
struct item *HeadItem;
struct item *TailItem;
struct client *HeadClient;
struct client *TailClient;
struct node *next;
};
struct client *create_node()
{
int x;
char name[30];
struct client *data = malloc(sizeof(struct client));
printf("Name: ");
scanf("%s",name);
strcpy(data->name,name);
printf("Last Name: ");
scanf("%s",name);
strcpy(data->last_name,name);
printf("Person : %s %s is added.\n", data->name,data->last_name);
return data;
}
struct node *AddClient(struct node *HeadNode,struct client *data)
{
if(HeadNode->HeadClient = NULL)
{
HeadNode -> HeadClient = data;
HeadNode -> TailClient = data;
data ->next = NULL;
HeadNode -> next = NULL;
}
else
{
data -> next = NULL;
HeadNode-> next -> TailClient = data;
HeadNode -> TailClient = data;
}
return HeadNode;
}
struct node *Display (struct node *HeadNode)
{
while(HeadNode->HeadClient =! NULL)
{
printf("%s",HeadNode->HeadClient->name,HeadNode->HeadClient->last_name);
HeadNode->HeadClient =HeadNode->HeadClient->next;
}
return 0;
}
int main()
{
struct node *temp;
AddClient(temp,create_node());
}
答案 0 :(得分:3)
好的,第一步:编译器警告。这将出现以下错误:
if(HeadNode->HeadClient = NULL) ...
这应与==
进行比较。将赋值=
和等式==
的比较混合起来很容易,而C语言允许这样做。
while(HeadNode->HeadClient =! NULL) ...
这很容易被忽视:不平等的比较是!=
首先是感叹号。 (助记符:这意味着!
不等于=
)。您已交换符号并有效地创建了两个运算符:您将=
的值!NULL
分配给HeadNode->HeadClient
。 “not null”的值为1,这使条件始终为true。这意味着循环永远运行 - 如果0x1
是有效指针。位不是,因此解除引用HeadNode->HeadClient
时程序崩溃。
printf("%s\n",
HeadNode->HeadClient->name, HeadNode->HeadClient->last_name);
格式字符串中有一个格式说明符,格式后面有两个参数。这并不像反过来那么糟糕,但不是你想要的。
您真正的问题是,您从temp
传递的头节点main
未初始化。 AddClient
的工作方式需要引用,因此将其初始化为NULL
无济于事。您必须将其初始化为某些数据,这可能涉及malloc
。
最好将程序重新组织为以NULL
指针表示的空列表开头。此外,您应该为每个新节点分配内存,而不是。函数AddClient
应该将新节点(具有自己新分配的内存)附加到列表的末尾。它应该确保最后一项的next
指针是NULL
。
添加第一个节点后,您将更改头指针。因此,您必须将指向节点的指针传递给函数,或者必须返回头指针的新值,以便更改将反映在后续调用中
此外,创建节点的例程称为AddClient
,创建客户端的例程称为create_node
。这是灾难的秘诀!
答案 1 :(得分:0)
你想要使用单个链表,所以我会跳过Tail部分,直到你有这个工作(这意味着你总是要运行到前一个到最后一个元素来添加东西),然后你可以改进将Tail放入结构
的代码