我正在尝试创建一个空的链接列表,该列表会询问用户列表可容纳的最大术语数。 (我没有添加我的代码,因为它只是一个printf)。然后我必须创建一个新函数,要求用户将输入插入到先前创建的列表中。
我的问题是,如何让create_q()
函数返回空列表?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node_t {
int value;
int priority;
struct node_t *next;
}node;
typedef struct priority_linked_list {
struct name *head;
int current_size;
int max_size;
}priority_list;
typedef node *Node;
typedef priority_list *List;
void create_q(int max_terms) {
node *head = NULL;
node *next = NULL;
List *current_size = 0;
List *max_size = max_terms;
}
答案 0 :(得分:1)
在C中,链表通常实现为存储在堆上的一系列节点,指向彼此。堆是一个持久的内存区域,它在程序的整个生命周期中运行。
当您在C函数中正常创建变量并且函数返回时,您创建的变量将不再可访问。但是,当您在函数中的堆上创建某些内容并返回该函数时,您在堆上分配的数据仍然存在。但是,除非函数返回指针,否则无法访问它。
那么你要为create_q()做的是在堆上创建链表(使用stdlib.h中的一个名为“malloc”的函数),然后你会返回指向你的第一个节点的指针,让main函数知道堆在哪里找到第一个节点。然后第一个节点会有一个指针,告诉程序堆在哪里找到第二个节点,等等。
但是,您可能以错误的方式接近链接列表。除非这是针对某种家庭作业项目,否则您可能不希望创建一个空链表。链表的一个好处是它是一个动态结构,您可以在其中轻松插入新节点。您仍然可以使用一些变量来跟踪列表所需的最大大小,但您可能不希望在必要之前实际创建节点。
请记住链接列表是什么。它是一组浮动在堆上的节点(在C中),每个节点存储一些数据,并包含指向浮动在堆上的下一个节点的指针。访问链表所需的只是指向第一个节点的指针。要添加新节点,只需“遍历”列表直到到达最后一个节点,然后创建一个新节点并让旧的最后一个节点指向它。
答案 1 :(得分:0)
Is this what you had in mind?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node_t
{
int value;
int priority;
struct node_t *next;
};
static int current_size;
static int max_size;
static struct node_t* head = NULL;
struct node_t* create_q(int);
struct node_t* create_q(int max_terms)
{
int i; // loop counter/index
current_size = max_terms;
max_size = max_terms;
if( NULL == (head = malloc(sizeof(struct node_t)*max_terms)))
{ // then, malloc failed
perror("malloc failed for struct node_t list");
exit( EXIT_FAILURE );
}
// implied else, malloc successful
// set all fields to '0,0,Null'
memset( head, 0x00, sizeof(struct node_t)*max_terms);
// set all next links, except last link
for(i=0;i<(max_terms-1);i++)
{
head[i].next = &head[i+1];
}
// set last link
head[i].next = NULL;
return( head );
} // end function: create_q
答案 2 :(得分:0)
我怀疑您正在寻找以下内容来创建或初始化优先级链表。
/*****
* alloc_q - allocate memory for the priority linked list
*/
struct priority_linked_list *alloc_q(void)
{
struct priority_linked_list *list;
list = malloc(sizeof(*list));
return list;
}
/******
* init_q - initialize the priority linked list
*/
void init_q(struct priority_linked_list *list, int max_terms)
{
list->head = NULL;
list->current_size = 0;
list->max_size = max_terms;
}
/******
* create_q - allocate AND initialize the priority linked list
*/
struct priority_linked_list *create_q(int max_terms)
{
struct priority_linked_list *list;
list = alloc_q();
if (list == NULL) {
return NULL;
}
init_q(list, max_terms);
return list;
}
节点的分配及其在列表中的添加/删除将单独处理。
上面可能有拼写错误(我没有测试过)。但是,它应该足以让你走上你想要的道路。
希望它有所帮助。