指针算法不在链表指针中工作?

时间:2015-04-11 13:50:05

标签: c pointers linked-list

我有一个链表,我想减少指向链表指针的指针,但是有一些问题。

对于以下C程序:

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *next;
};

int main()
{
    /*Create an empty list*/
    struct node *head = NULL;

    /*Set the first node of list*/
    head = malloc(sizeof(struct node));
    head->data = 1;
    head->next = NULL;

    struct node *head1 = head;

    /*Set the second node of list*/
    head1->next = malloc(sizeof(struct node));
    head1 = head1->next;
    head1->data = 2;
    head1->next = NULL;

    /*Print 1st and 2nd node data*/
    printf("%d ",head->data);
    head = head->next;
    printf("%d ",head->data);

    /*Decrement head. As head was pointing to 2nd node, after head-- it should point to first node ??*/
    head--;
    printf("%d \n",head->data);

    return 0;
}

我期待以下输出:

1 2 1 

但是我的输出低于输出:

User $ ./a.out
1 2 0 
User $

所以看起来我最后做的head--并没有真正地将head递减1(如果head在执行最后一次printf之前指向第一个节点) 。

所以不能递增或递减链表指针?就像我们为普通指针做的那样?例如:对于a [],我们做一个++或a--指出下一个或宝贵的索引。

注意:我只是意识到链接的列表节点不在连续的存储位置,所以做头 - 指向以前的节点不会感觉到。

感谢所有回答或评论的人。

4 个答案:

答案 0 :(得分:3)

当您使用malloc()时,您将从RAM(现金或注册)中分配新的内存位置,该位置位于随机区域中。所以,当你写head--;时,你会移动到你想要的完全不同的区域。尝试使用双向链表。

答案 1 :(得分:3)

简单指针算法仅适用于连续的数据结构。链表是不连续的。

当您分配新对象时,会为其指定一个新的内存位置,该位置不受列表中上一项的内存位置的上下文限制。

当您递增或递减指针时,指针的值会根据指针类型的大小而改变。这很可能会指向链表之外。

您尝试使用数组,因为数组项在连续内存中分配。

您需要一个包含下一个和上一个指针的双向链表。所以你可以回到元素的前身。

答案 2 :(得分:1)

指针head指向为其指向的节点分配的内存 - 没有别的。您没有关于该指针附近的内容的信息,也无法假设malloc()的内存位于其外的任何位置,以及为了任何目的而适当对齐&# 39;,如果我没记错标准。

答案 3 :(得分:1)

答案是 NO ,你只能使用指针算术来移动指针指针类型的多个单位,就像这样

char array[2] = {'a', 'b'};

print("%c\n", *(array + 0));
/*             ~~~~~~~~~~~                         */
/*                  ^ points to the address of 'a' */
print("%c\n", *(array + 1));
/*             ~~~~~~~~~~~                                                */
/*                  ^ points to 'b', i.e. 1 byte after the address of 'a' */

将输出

a
b

但链接列表通过指针链接到下一个元素,该指针是列表结构的成员,因此增加它没有意义,list++实际上等同于

list = ((char *)list) + sizeof(*list)

所以当你像这样递增指针时,它并没有指向下一个节点,它在指向增量之前指向的位置之后指向sizeof(struct node)个字节。

要制作指针,请指向您需要的下一个节点

list = list->next;