使用双指针在C中进行链接列表插入

时间:2018-11-17 20:17:35

标签: c data-structures linked-list insertion

您好,我是一个学习链表的新手,我创建了此示例程序,但并未填充所有列表,仅填充了最后两个(或覆盖了第一个链接元素)

有人可以帮我造成问题的原因吗?

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

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

void appendNode(int data, struct node **ptr) {

    struct node *newnode = (struct node*)malloc(sizeof(struct node));

    newnode->data = data;
    newnode->link = NULL;

    if(*ptr == NULL) {
         *ptr = newnode;
    } else {
        while((*ptr)->link != NULL ) {
            *ptr = (*ptr)->link;
        }
        (*ptr)->link = newnode;
    }

}

void printList(struct node *node) 
{ 
  while (node != NULL) 
  { 
     printf(" %d ", node->data); 
     node = node->link; 
  } 
} 

int main() {

    struct node *head = NULL ;

    appendNode(23,&head);
    appendNode(45,&head);
    appendNode(32,&head);
    appendNode(11,&head);
    appendNode(98,&head);
    printList(head);

}

Ir指纹

 11  98 

是什么引起这里的问题?

2 个答案:

答案 0 :(得分:1)

您的问题是您正在appendNode [1] 中使用指针本身进行迭代。每次您将内容分配给*ptr(例如

)时,此操作都会更改列表地址
     *ptr = newnode;
     ...
        *ptr = (*ptr)->link;

每次分配*ptr时,列表地址都会更改(在appendNodemain()中都可见)

您的列表操作是正确的,您需要做的只是使用临时指针遍历列表(下面的iter

void appendNode (int data, struct node **ptr) {

    struct node *newnode = malloc (sizeof *newnode),
        *iter = *ptr;

    if (!newnode) { /* VALIDATE every allocation */
        perror ("malloc-newnode");
        exit (EXIT_FAILURE);
    }

    newnode->data = data;
    newnode->link = NULL;

    if (iter == NULL) {
        *ptr = newnode;
    }
    else {
        while (iter->link != NULL) {
            iter = iter->link;
        }
        iter->link = newnode;
    }
}

注意,使用与sizeof一起使用的取消引用的指针来设置类型大小。如果使用取消引用的指针来设置大小,则可以消除设置实际所需的类型。此外,如果您分配-您必须每次都进行验证)

此更改(以及以下对printList的更改)

void printList (struct node *node) 
{ 
    while (node != NULL) 
    { 
        printf(" %d ", node->data); 
        node = node->link; 
    }
    putchar ('\n');     /* tidy up with newline */
} 

您的列表可以很好地工作,例如

使用/输出示例

$ ./bin/lllast2
 23  45  32  11  98

脚注:

1。尽管不是错误,但C通常避免使用camelCaseMixedCase变量名,而是使用所有小写字母同时保留大写名称以用于宏和常量。这是一个风格问题-完全取决于您,但是如果不遵循它,可能会在某些圈子中导致错误的第一印象。

答案 1 :(得分:0)

替换:

let width:CGFloat = self.yourCollectionView.frame.width/CGFloat(crossWordData[0].count)
let height:CGFloat = self.yourCollectionView.frame.height/CGFloat(crossWordData.count) - cellsBorderWidth

使用:

while((*ptr)->link != NULL ) {
    *ptr = (*ptr)->link;
}
(*ptr)->link = newnode;

虽然最好将其提取到自己的函数中

struct node* last = *ptr;
while (last->link) {
    last = last->link;
}
last->link = newnode;

然后在struct node* findLastNode(struct node* ptr) { while (ptr->link) { ptr = ptr->link; } return ptr; } 内:

appendNode