您好,我是一个学习链表的新手,我创建了此示例程序,但并未填充所有列表,仅填充了最后两个(或覆盖了第一个链接元素)
有人可以帮我造成问题的原因吗?
#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
是什么引起这里的问题?
答案 0 :(得分:1)
您的问题是您正在appendNode
[1] 中使用指针本身进行迭代。每次您将内容分配给*ptr
(例如
*ptr = newnode;
...
*ptr = (*ptr)->link;
每次分配*ptr
时,列表地址都会更改(在appendNode
和main()
中都可见)
您的列表操作是正确的,您需要做的只是使用临时指针遍历列表(下面的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通常避免使用camelCase
或MixedCase
变量名,而是使用所有小写字母同时保留大写名称以用于宏和常量。这是一个风格问题-完全取决于您,但是如果不遵循它,可能会在某些圈子中导致错误的第一印象。
答案 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