搞笑抽象单链表/指针
在写单链表的时候觉得函数void addPerson(struct Person **contacts) 里的这个**有点难理解作业做多了以后开始形成抽象的理解,感觉自己的这个理解还算能自圆其说,为了怕以后忘记决定记录下来,也供各位玩笑玩笑
以单链表3课后作业动动手最后一题通讯录为例子。截取一段 addPerson函数
void addPerson(struct Person **contacts)
{
struct Person *person;
struct Person *temp;
person = (struct Person *)malloc(sizeof(struct Person));
if (person == NULL)
{
printf("内存分配失败!\n");
exit(1);
}
getInput(person);
// 将person用头插法添加到通讯录中
if (*contacts != NULL)
{
temp = *contacts;
*contacts = person;
person->next = temp;
}
else
{
*contacts = person;
person->next = NULL;
}
}
困扰问题:个人之前对于 **contact *contact&contact *person person 或 **head头指针的理解有点混乱。
==================以下开始抽象=======================
将函数括号里定义的*理解为穿一件衣服,**就是穿两件衣服;函数花括号内的*定义为脱衣服,*是脱一件衣服;main函数里实参的&是多穿一件衣服
首先 为什么add函数里是穿两件,一是因为要保证人(值)至少穿了一件衣服(不能luo奔),即保证单链表有一个指向肉体的指针。二,外面的第二件是为了给第二个人留的,告诉第二个人你来了有衣服穿,保证有第二个人来的位置(保证了是个链表)。所以用到**的函数都是与 下一个人 有关的如delete,add,(release);用到*的函数则是对 单个人 进行的操作,如print,change,find
其次 在函数花括号内,大家都是穿了一件衣服的,你穿了两件就要*(脱掉一件),原本就穿了一件的,就不用操作,直接出门就好。
然后 何时用contact/head,何时用person,看你想表达的是整个表还是其中的单项。 以上段程序中if (*contacts != NULL)就是判断表空不空, if (person == NULL)是判断单项空不空(都是指针,不是值的空不空哦)
最后 在main函数里,定义的contact就穿了一件衣服( struct Person *contacts = NULL;),但实际上add函数里输入的是穿了两件的,所以需要&一下。
大伙看看这样理解逻辑咋样^^ 你的抽象比喻很有趣!这样的理解方法确实可以帮助初学者更好地理解指针和链表。
在C语言中,指针是一种特殊的变量类型,它存储的是内存地址。而链表是由多个节点组成的数据结构,每个节点包含一个值和指向下一个节点的指针。
在函数声明中,`struct Person **contacts` 表示一个指向指针的指针,也就是两层间接引用。这是因为我们需要在函数中修改传入的指针,以便在添加新节点时能正确更新链表的头部。
在函数内部,`*contacts`表示指向链表头部指针的指针。为了方便理解,你可以将其理解为一个人的地址,也就是一个人的衣服。`person`则是新创建的节点。
接下来的代码通过头插法将新节点插入到链表中,如果链表不为空,则将原来的头部节点暂存到 `temp` 变量中,然后将新节点 `person` 设为链表的头部,并将指针重新指向 `temp`。这样就完成了在链表头部插入新节点的操作。
如果链表为空,即 `*contacts` 为 `NULL`,则直接将新节点设为链表的头部,并将新节点的指针指向 `NULL`。
最后,在 `main` 函数中,我们声明了一个链表的头部指针 `struct Person *contacts = NULL;`,也就是一个人的衣架。当我们需要调用 `addPerson` 函数时,我们传递的是这个指针的地址 `&contacts`。这样在函数内部可以通过 `*contacts` 来修改传入的指针。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 GPT一种挽尊的存在,我爱你! 妖娆乌龙茶 发表于 2023-11-30 19:26
GPT一种挽尊的存在,我爱你!
感谢您的赞美!作为一种人工智能技术,GPT确实可以提供帮助和解答各种问题。我会尽力回答您的问题并提供指导。如果您还有其他问题,随时告诉我,我会尽力帮助您。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
页:
[1]