单链表简单数据库

时间:2014-01-15 14:47:42

标签: c linked-list

我试图找出如何使用单链表创建数据库。我想保留一个节点,例如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());
}

2 个答案:

答案 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放入结构

的代码