C 创建三个结构链表的简单方法
我想创建一个总共包含三个结构的链接列表。C 创建三个结构链表的简单方法,c,struct,C,Struct,我想创建一个总共包含三个结构的链接列表。 有没有办法使下面的代码更简单 #包括 #包括 结构你好{ int数据; 结构hello*next; }; void main() { 结构hello*head; if(head==NULL){ head=malloc(sizeof(struct hello)); head->next=malloc(sizeof(struct hello)); head->next->next=malloc(sizeof(struct hello)); head->nex
有没有办法使下面的代码更简单
#包括
#包括
结构你好{
int数据;
结构hello*next;
};
void main()
{
结构hello*head;
if(head==NULL){
head=malloc(sizeof(struct hello));
head->next=malloc(sizeof(struct hello));
head->next->next=malloc(sizeof(struct hello));
head->next->next->next=NULL;
}
}
如果您不打算添加更多节点(结构),即使这意味着从列表中删除一个节点并将其重新放入,您也可以通过删除
if(head==null)
if语句。它在开始时无论如何都是空的(很可能是垃圾值)
但是,不建议以这种方式实施链表。它缺乏可伸缩性(我的意思是,如果以后必须增加节点的数量,这将是一件乏味的事情),并且使以后进行更改变得更加困难(在本例中几乎不可能)
互联网上有大量的链表示例。一些好习惯包括添加节点函数、删除节点函数和搜索节点函数。只需将这些函数添加到链接列表中,代码就会变得更易于管理
如果不必是链表,int[3]数组也可以
希望这能有所帮助。最基本、最容易理解、最简单的解决方案之一是获取指针数组和循环 我可以观察到的代码的另一个问题是:
struct hello *head;
if (head == NULL) { }
head
是指针类型的局部变量,除非您的代码这样做,否则不能保证将其初始化为零
在下面的代码中,pNode
将为您执行此操作
#include <stdio.h>
#include <stdlib.h>
struct hello {
int data;
struct hello *next;
};
int main(void)
{
int i = 0;
struct hello *pNode[3] = { NULL, NULL, NULL };
for(i = 0; i < 3; i++)
{
pNode[i] = malloc(sizeof(struct hello));
if(pNode[i] == NULL)
{
printf("No memory");
// Some error-handling
return -1;
}
}
// lets link all the nodes that were malloc'ed (successfully)
for(i = 0; i < 2; i++) //Note: loop from index 0 to 1, instead of 2.
{
pNode[i]->next = pNode[i+1];
}
pNode[2]->next = NULL;
// Ugly, straight, crude way to write data values
pNode[0]->data = 10;
printf("\n%d", pNode[0]->data);
pNode[0]->next->data = 20;
printf("\n%d, %d", pNode[0]->next->data, pNode[1]->data);
pNode[0]->next->next->data = 30;
printf("\n%d, %d", pNode[0]->next->next->data, pNode[2]->data);
return 0;
}
#包括
#包括
结构你好{
int数据;
结构hello*next;
};
内部主(空)
{
int i=0;
结构hello*pNode[3]={NULL,NULL,NULL};
对于(i=0;i<3;i++)
{
pNode[i]=malloc(sizeof(struct hello));
if(pNode[i]==NULL)
{
printf(“无内存”);
//一些错误处理
返回-1;
}
}
//让我们链接(成功)malloc'ed的所有节点
for(i=0;i<2;i++)//注意:从索引0循环到1,而不是2。
{
pNode[i]->next=pNode[i+1];
}
pNode[2]->next=NULL;
//写数据值的丑陋、直接、粗糙的方式
pNode[0]->data=10;
printf(“\n%d”,pNode[0]->数据);
pNode[0]->next->data=20;
printf(“\n%d,%d”,pNode[0]->next->data,pNode[1]->data);
pNode[0]->next->next->data=30;
printf(“\n%d,%d”,pNode[0]->next->next->data,pNode[2]->data);
返回0;
}
确保您养成了检查malloc是否返回任何内容的习惯,否则您也需要处理该错误
请记住,上面的代码总是可以以更优化、智能和复杂的方式实现的。只是我想抛出一个基本的代码,它似乎能做到它所说的,并且你可以随时根据需要去改变它。你的代码中有一个错误的假设:指针
头
将被初始化为空指针。不是。没有显式初始化的head
的值是不确定的,看起来几乎是随机的(很可能不是NULL
)。顺便问一下,这是一种家庭作业吗?因为否则,创建这样一个有限的列表,而不是创建用于在任何列表中添加和删除节点的通用函数是没有意义的。。您拥有的代码(减去head==NULL
check)是创建这样一个(简短!)列表的最简单方法。多做一个循环肯定会更好,特别是因为您似乎不关心节点的顺序或它们的数据
。是的,您可以非常简单地声明一个struct数组,然后简单地连接下一个添加元素的指针,直到填充数组为止。在这里,您将存储用于堆栈上的数组,而不是使用堆中的malloc
创建存储,但除此之外,基本列表操作完全相同。如果您需要一个示例,请告诉我。哦,如果将节点总数固定为3,那么“head->next->next->next->next=NULL;”也不是必需的。