在C语言中,指针如何处理双链表?
如果我创建以下结构:在C语言中,指针如何处理双链表?,c,pointers,struct,doubly-linked-list,C,Pointers,Struct,Doubly Linked List,如果我创建以下结构: typedef struct node { int a; char b[100][15]; struct node *prev; struct node *next; } Scope; 我必须使用指针来初始化头部节点吗?目前这是我的初始化函数: Scope initScope() { Scope head; head.a = 1; head.prev = NULL; head.next = NULL;
typedef struct node {
int a;
char b[100][15];
struct node *prev;
struct node *next;
} Scope;
我必须使用指针来初始化头部节点吗?目前这是我的初始化函数:
Scope initScope() {
Scope head;
head.a = 1;
head.prev = NULL;
head.next = NULL;
return head;
}
在某种功能上,我会说
Scope head = initScope();
到目前为止,这似乎还可以,但我不确定如何创建新节点。我猜我需要一个Scope类型的指针。我必须malloc它的大小范围,然后初始化它的值。我应该在创建头部时执行相同的操作吗?我试图回答的基本问题是,指针的用途是什么?如果在我写的结构的定义中
*Scope
而不是
Scope
??如果我需要使用指针来创建节点,那么为什么不让结构成为指针呢?根据我的理解,指针只允许我操作内存,所以当我创建一个节点并继续前进时,会留下什么呢
到目前为止,这似乎还可以,但我不确定如何创建新节点
Scope
对象的prev
和next
成员必须指向其他Scope
对象以创建链接列表
这些对象可以是静态分配的对象数组,也可以是动态分配的对象数组
Scope scopes[10];
scopes[0].prev = NULL;
scopes[9].next = NULL;
for (int i = 0; i < 9; ++i )
{
scopes[i].next = &(scopes[i+1]);
scopes[i+1].pref = &(scopes[i]);
}
然后将其类似于静态分配的数组
根据分配对象的方法,您需要使用正确的调用free
那么我将使用指针来创建节点?第一个节点将有空指针,之后的每个节点都将链接到下一个指针?所以我只是用struct来分配一定大小的内存块?指针指向对象。我不知道你的意思,所以我会使用指针来创建节点?如果只有一个节点,则它是
next
和prev
成员将为空。否则,他们不会。是的,您正在使用一个struct
来分配一个特定大小的内存块。我的意思是,与其说int=5
,不如说int*ptr=malloc(sizeof(int))&ptr=5代码>所以本质上我是在分割int大小的内存。现在把这个想法应用到链表中,我必须这样做,否则每个节点都会有一个唯一的变量名,对吗?或者我有一个节点数组,每个节点都有一个唯一的索引?我想我开始明白为什么我需要在头部之后的节点上使用指针了。@Pareod,你的方向是对的。唯一不正确的是您需要使用*ptr=5代码>,而不是&ptr=5但是ptr指向一个int大小的内存块,所以不会&ptr=5代码>将数字5放入该内存块?说ptr=5
会改变指针正在查看的内存块。例如,currentNode=currentNode->prev代码>不会将当前内存设置为prev,它会更改currentNode查看的位置。
Scope* node = malloc(sizeof(*node));
node->next = node->prev = NULL;
for ( int i = 0; i < 9; ++i )
{
Scope* temp = malloc(sizeof(*temp));
temp->prev = NULL;
temp->next = node;
node->prev = temp;
node = temp;
}
Scope* scopes = malloc(10*sizeof(*scopes));