c - C 中的简单链表函数

标签 c function pointers struct linked-list

我正在尝试创建一个简单的列表,我可以在其中添加俱乐部成员(其中数据是 val 成员(member) ID 号、姓名、姓氏、年龄)。

使用 add_to_list 函数时,我在用主函数中的成员数据填充节点时遇到问题。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


// Creating structure for node
struct test_struct
{
int val;         // val is member id number
char name;
char lastn;
int age;
struct test_struct *next;
};




// declaring global head and curr pointers
struct test_struct *head = NULL;
struct test_struct *curr = NULL;






// creating a list
struct test_struct* create_list(int val, char* name, char* lastn, int age)
{
printf("\n creating list with head node as [%d] [%s] [%s] [%d] \n", val, name, lastn, age);

struct test_struct *ptr = malloc(sizeof(struct test_struct)); // creating list
if(NULL == ptr)
{
  printf("\n Node creation failed \n");
  return NULL;
}

ptr->val = val;
ptr->name = *name;
ptr->lastn = *lastn;
ptr->age = age;
ptr->next = NULL;

head = curr = ptr;

return ptr;

}





// add member to list
struct test_struct* add_to_list(int val, char *name, char *lastn, int age, bool add_to_end)
{
if(NULL == head)
{
    return (create_list(val, name, lastn, age));
}


if(add_to_end)
{
printf("\n Adding node to end of list with data [%d] [%s] [%s] [%d] \n", val, name, lastn, age);
}
else
{
printf("\n Adding node to beginning of list with data [%d] [%s] [%s] [%d] \n", val, name, lastn, age);
}

struct test_struct *ptr = malloc(sizeof(struct test_struct));

if(NULL == ptr)
{
    printf("\n Node creation failed \n");
    return NULL;
}

ptr->val = val;
ptr->name = *name;
ptr->lastn = *lastn;
ptr-> age = age;
ptr-> next = NULL;

if (add_to_end)
{
    curr-> next = ptr;
    curr = ptr;
}
else
{
    ptr -> next = head;
    head = ptr;
}

return ptr;
} 






//search a name in created list
struct test_struct* search_in_list(char name, char lastn, struct test_struct **prev)
{
struct test_struct *ptr = head;
struct test_struct *tmp = NULL;
bool found = false;

printf("\n Searching the list for the value [%s][%s]\n", name, lastn);

while(ptr != NULL)  // searching loop
{
    if(ptr->name == name && ptr->lastn == lastn)
    {
        found = true;
        break;
    }
    else
    {
        tmp = ptr;
        ptr = ptr->next;
    }
}
return ptr;

if(true == found)
{
    if(prev)
    {
    *prev = tmp;
    return ptr;
    }

    else
    {
    return NULL;
    }

  }
 }






//printing the list
void print_list(void)
{
struct test_struct *ptr = head;

printf("\n -----Printing list Start----- \n");

while(ptr != NULL)
{
    printf("\n [%d] \n", ptr -> val);
    printf("\n [%s] \n", ptr -> name);
    printf("\n [%s] \n", ptr -> lastn);
    printf("\n [%d] \n", ptr -> age);
    ptr = ptr->next;
}

printf("\n -----Printing list end---- \n");

return;
}




//printing the list 2 is for printing age only
void print_list2(void)
{
struct test_struct *ptr = head;

printf("\n -----Printing list Start----- \n");

while(ptr != NULL)
{
    printf("\n [%d] \n", ptr -> age);
    ptr = ptr->next;
}

printf("\n -----Printing list end---- \n");

return;
}




// main function
int main(void)
{
char n, l;
struct test_struct *ptr = NULL;


// for adding member to list
    add_to_list(123, "william", "shakespeare", 30, true);
    add_to_list(124, "william", "gibson", 35, true);
    add_to_list(125, "chuck", "palahniuk", 40, true);
    add_to_list(126, "mario", "puzio", 50, true);
    add_to_list(127, "umberto", "eco", 60, true);
    add_to_list(128, "ezra", "pound", 125, true);

    print_list();




// for searching name in list
    ptr = search_in_list(n, l,  NULL);
    if(NULL == ptr)
    {
        printf("\n Search [name = %s] [lastn = %s] failed, no such element found \n", n, l);
    }
    else
    {
        printf("\n Search passed [name = %s] [lastn = %s] \n", ptr->name, ptr->lastn);
    }


    print_list();



return 0;
}

最佳答案

您的链表实现看起来很好,除了以下问题

  • 您的链表节点成员变量“name”和“lname”的类型为 char,但您正尝试将 char* 添加到链表中。
  • 由于输入参数“prev”,search_in_list 失败。看来不需要了。只需在 while 循环后添加“return ptr”即可。

关于c - C 中的简单链表函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32752043/

相关文章:

c - 需要帮助从 Delphi 正确调用 C 函数

c - C 中是否有 sizeof() 的等价物?

javascript - 使用不带正则表达式的循环来匹配字符串上的模式

javascript - 如何向 append 元素添加函数

arrays - 如何消除使用指针的二维数组声明中的错误?

使用 frama-c 的值分析计算函数的可达性

c++ - 使用指向成员函数的指针 C++ 将成员函数作为参数传递

pointers - 复制包含指向 CUDA 设备的指针的结构

c - 如何表示一个指向多个对象的容器?

c - GDB 跳过共享库断点