链接列表由2个结构组成。访问节点

时间:2017-11-11 12:41:30

标签: c pointers struct linked-list

我正在努力学习基础知识,谁会想到,指针正在杀死我。我想创建一个基本的链表。为此,我创建了两个结构,一个有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的复杂知识是有限的。

2 个答案:

答案 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);