马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在写单链表的时候觉得函数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函数里输入的是穿了两件的,所以需要&一下。
大伙看看这样理解逻辑咋样^^ |