指向结构递增的指针

时间:2012-01-10 14:11:04

标签: c

在C中实现了一个单一的链表。

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

struct list_el {
   int val;
   struct list_el * next;
};

typedef struct list_el item;

    void main() {
       item * curr, * head,*track;
       int i;
       head = NULL;
       for(i=1;i<=10;i++) {
          curr = (item *)malloc(sizeof(item));
          curr->val = i;
          curr->next=0;
          if(head!=NULL)
          head->next  = curr;
          head = curr;
       }
       curr = curr-10;

       while(curr) {
          printf("%d\n", curr->val);
          curr = curr->next ;
       }
    }

由于列表中有10个元素,所以为了使指针指向第一个元素,我尝试将curr(指向struct的指针)减少10,但这让我在列表的一半处,打印的值为{ {1}}。

结构的大小是4,而指针的大小是2,似乎指针减少2 * 10 = 20个字节而不是40,这是正常的吗? (因为我读到指针根据其类型的大小递增/递减)

5 个答案:

答案 0 :(得分:5)

您不能在链表上使用指针算法:项目是单独分配的(使用malloc),因此它们不一定在内存中相邻。这种方法只适用于数组。

答案 1 :(得分:2)

有几个问题。

首先,以下插入代码不正确:

      if(head!=NULL) head->next  = curr;
      head = curr;

基本上,head指向的元素不可避免地丢失了。

其次,以下代码的行为未定义:

curr = curr-10;

您无法使用指针算法移动多个malloc() ed块。

修复插入逻辑后,就可以像这样遍历列表:

for (curr = head; curr != NULL; curr = curr->next) {
    ....
}

答案 2 :(得分:0)

您的代码curr = curr-10不会让您回到链接列表的头部。

答案 3 :(得分:0)

正如Viruzzo在评论中指出的那样,你不能在链表的元素上使用指针算法。正如“链接”一词所暗示的那样,只有将项目链接在一起的指针,它们不需要位于相邻的地址。

指针算术只会将指针减少固定的字节数,它不会跟随指针。您的列表是单链接的,甚至不会 以前的元素指针。

答案 4 :(得分:0)

curr = curr-10;错了。它不会执行您认为的操作!

要打印链接列表的内容,您需要从head开始并遍历每个节点,直到您点击NULL(假设它不是循环列表)。

void display()
{
        NODE * current = head;

        if (current == NULL) {
                printf("Empty list \n");
                return;
        }

        while(current != NULL) {
                printf("%d ", current->data);
                current = current->next;
        }

        printf("\n");
        return;
}

要在前面添加新节点,您可以使用以下代码段。

void addfront(int data)
{
        NODE *newnode = NULL;

        if ((newnode = malloc(sizeof(NODE))) != NULL) {
                newnode->data = data;
                newnode->next = NULL;   
        } else {
                printf("Couldn't allocate space for new element \n");
                return;
        }       

        if (head == NULL) {
                // empty list
                head = newnode; 
                tail = newnode;
        } else {
                newnode->next = head;
                head = newnode;
        }

        return;
}

要在后面添加新节点,您可以使用以下代码段。

void addrear(int data)
{
        NODE * newnode = NULL;

        if ((newnode = (NODE *) malloc(sizeof(NODE))) != NULL) {
                newnode->data = data;
                newnode->next = NULL;
        } else {
                printf("unalbe to allocate memory to the new element - %d \n", data);
                return;
        }

        if (tail == NULL) {
                assert(head == NULL && tail == NULL);
                head = tail = newnode;
        } else {
                tail->next = newnode;
                tail = newnode;
        }

        return;
}

上面提到的所有代码段都假设您有headtail作为全局变量。

希望这有帮助!