gpt4 book ai didi

c - 链表和指针

转载 作者:行者123 更新时间:2023-11-30 19:39:41 27 4
gpt4 key购买 nike

我试图将主链表的地址传递给指针,将其传递给函数以为其分配内存并遍历到下一个节点,同时保持下一个节点的位置而不破坏头节点。

typedef struct {
int data;
struct node_list *next;
}node_list;

typedef struct {
struct node_list *head;
}list;

void insert_list(node_list **c, int num);

void main()
{
int num;
list *list_odd = (list*)calloc(1, sizeof(list));
node_list *c = &list_odd->head;

while (num != -1)
{
if (num % 2)
insert_list(c, num);
}
}

void insert_list(node_list **c, int num)
{
if (*c == NULL)
{
*c = (node_list*)malloc(sizeof(node_list)); // it allocates the memory in the right place.
(*c)->data = num;
(*c) = (*c)->next; // but this step breaks the starting list pointer
}
else
{
(*c)->next = (node_list*)malloc(sizeof(node_list));
(*c)->data = num;
(*c) = (*c)->next;
}
}

编辑:我可能不会自己解释,澄清一下:如果我的列表指向链表的开头,当我为其分配内存然后执行 (*c) = (*c)->next 时,我的头不再指向乞讨。我想要实现的是获得列表的开头并保存下一个节点的位置。

最佳答案

我想建议一个双向单链表。

这是一个演示程序。

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

typedef struct node
{
int data;
struct node *next;
} node;

typedef struct list
{
node *head;
node *tail;
} list;

int push_back( list *lst, int data )
{
node *new_node = malloc( sizeof( node ) );
int success = new_node != NULL;

if ( success )
{
new_node->data = data;
new_node->next = NULL;

if ( lst->tail == NULL )
{
lst->tail = lst->head = new_node;
}
else
{
lst->tail = lst->tail->next = new_node;
}
}

return success;
}

void display( list *lst )
{
for ( node *current = lst->head; current != NULL; current = current->next )
{
printf( "%d ", current->data );
}
printf( "\n" );
}

int main( void )
{
list lst = { NULL, NULL };

int data;

while ( scanf( "%d", &data ) == 1 && data != -1 )
{
if ( data % 2 != 0 ) push_back( &lst, data );
}

display( &lst );

return 0;
}

如果输入这个数字序列

0 1 2 3 4 5 6 7 8 9 -1

那么输出将是

1 3 5 7 9 

向链表末尾添加新节点的复杂度为 O(1)。

关于c - 链表和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36233185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com