我正在努力学习基础知识,谁会想到,指针正在杀死我。我想创建一个基本的链表。为此,我创建了两个结构,一个有3个指针的linkedList,一个用于第一个节点,一个用于当前节点,一个用于最后一个节点。我希望这可以更容易地插入新节点。 然后我有节点,它只是一个值和一个指向新节点的指针。
typedef struct linkedList linkedList;
struct linkedList{
struct node* start;
struct node* last;
struct node* current;
};
typedef struct node node;
struct node{
int value;
struct node* next;
};
我使用
创建一个新节点node* newNode(int value){
node* newNode = (node*)malloc(sizeof(node));
newNode->next = NULL;
newNode->value = value;
return newNode
}
现在,在主要内容中,我使用
创建一个新的链接列表linkedList List;
List.start = NULL;
List.current = NULL;
List.last = NULL;
node* node1 = newNode(1);
List.start = node1;
List.current = node1;
List.last = node1;
现在,如何使用链接列表访问节点的内容? 如果我这样做,我将如何在Java中完成它,编译器说 "错误:请求会员'价值'在不是结构或联合的东西中#34; 如果我尝试
List.start.value = 1;
如果我尝试
(*(List.start)).value = 1;
它编译但给我一个分段错误。 我不确定指针的工作方式,真的。我在谷歌找到的链接列表全部使用了节点,没有主要链接列表进行交互。我在学校课程中几乎被抛到深处,所以我对c的复杂知识是有限的。
答案 0 :(得分:0)
您所做的就像N
个独立节点,每个节点都知道第一个节点,最后一个节点及其自身。
你说你想创建一个链表?得到任何暗示?链接在哪里?您必须将它们连接在一起以形成一个数据结构,这将使访问更容易。
因此,我将概述我们做这些事情的标准方式。你会有一些阅读要做。
你想要实现的是Doubly linked list
,其中每个节点都知道其他两个节点,一个在它之前,另一个在它之后。
现在可以更轻松地插入节点并将其删除。
struct node { int数据; struct node * next; struct node * prev; };
现在你需要创建一个双向链表,你将在main()
struct node*head= malloc(sizeof(struct node));
if( head == NULL){
fprintf(stderr, "%s\n","Error in malloc" );
exit(1);
}
insert(head, data);
...
..
void insert( struct node * head, int data){
struct node*temp= malloc(sizeof(struct node));
if( temp == NULL){
fprintf(stderr, "%s\n","Error in malloc" );
exit(1);
}
temp->data = data;
temp->next = head;
temp->prev = NULL;
head = temp;
}
使用完毕后,请删除双向链表。
你怎么做......
linkedList List;
List.start = NULL;
List.current = NULL;
List.last = NULL;
node* node1 = newNode(1);
List.start = node1;
List.current = node1;
List.last = node1;
现在,如果你想访问node1
,你可以这样做
(*List.start).value = 1;
或者
(List.start)->value = 1;
List.start.value
基本上是尝试在node1
的地址上找到值字段。编译器不知道如何从非结构或非联合元素中获取它。
关于我上次错误的一个小演示: -
#include <stdio.h>
#include <stdlib.h>
typedef struct linkedList linkedList;
struct linkedList{
struct node* start;
struct node* last;
struct node* current;
};
typedef struct node node;
struct node{
int value;
struct node* next;
};
node* newNode(int value){
node* newNode = (node*)malloc(sizeof(node));
if( newNode == NULL){
fprintf(stderr,"error in malloc");
exit(1);
}
newNode->next = NULL;
newNode->value = value;
return newNode;
}
int main(){
linkedList List;
List.start = NULL;
List.current = NULL;
List.last = NULL;
node* node1 = newNode(1234);
List.start = node1;
List.current = node1;
List.last = node1;
printf("%d\n", (List.start)->value);
printf("%d\n", (*List.start).value);// this works
}
答案 1 :(得分:0)
List.start.value = 1;
以上不会奏效。 List.start
会给node1
,所以接下来你需要node1->value
,因为node1是结构类型的指针。
请使用以下声明:
(List.start)->value = 200;
或者您也可以这样使用它:
(*(List.start)).value = 200;
用这个测试这些:
printf("accessing : %d\n", node1->value);