我正在努力提高我的 c 编程技能,因此开始尝试编写双链表。
到目前为止,这是我想出的。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//forward definition
typedef struct Node node_t;
//Define the structures needed for double linked list
//Each node
typedef struct Node
{
int data;
node_t *next;
node_t *prev;
}node_t;
void initList(node_t** first , node_t** last)
{
//Allocate memory for the first and the last node
*first = (node_t*) malloc(sizeof(node_t));
*last = (node_t*) malloc(sizeof(node_t));
(*first)->data = 1;
(*last)->data = 2;
(*first)->prev = NULL;
(*last)->next = NULL;
(*first)->next = (*last)->prev;
return;
}
void destroyList(node_t** first)
{
node_t* temp;
temp = *first;
free((*first)->next);
free((*first));
temp = NULL;
return;
}
int main()
{
node_t *first =NULL, *last = NULL;
printf("Initalizing the List\n");
initList(&first,&last);
printf(" 1st element is %d\n",first->data);
printf(" 2nd element is %d\n",last->data);
printf("Destroying the List\n");
destroyList(&first) ;
return 0;
}
我实际上在网上查找了一些代码,我发现大多数实现都有
1) Node 的 1 个结构和 List 本身的 1 个结构(带头和尾)。我的问题是,这是强制性的吗?我不能只用 1 个结构来实现它吗?
2)我的想法是将这个文件作为一个库并从应用程序中调用它。像
InitList()、DestroyList()、AddNode、DeleteNode 等。
这就是为什么我对INit 和destroy 使用双指针。我在销毁列表时遇到了一些麻烦。我知道我做错了,我会继续纠正它。
3)我找到了那个节点指针
temp = first
指着某个地址。如果我做临时++。为什么它不指向下一个节点?
4)我们可以传递第一个或最后一个节点指针来删除整个列表对吗?(即遍历和删除顺序?)
谢谢!