首先我想创建一个链表,并把这个功能单独拿出来作为一个函数,一开始我仅仅传递了我在main中新建链表的“值”过去
也就是
typedef struct Node {
int data;
struct Node* next;
} Node, *LinkedList;
void CreateList(LinkedList N, int n) //***1
{
N = (LinkedList)malloc(sizeof(Node));
N->next = NULL;
LinkedList new = N;
Node *p;
for (int i = 0; i < n; ++i) {
p = (Node *)malloc(sizeof(Node));
scanf("%d", &(p->data));
new->next = p;
new = p;
}
new->next = NULL;
}
int main()
{
LinkedList list;
CreateList(list, 20); //***2
printf("%d", list->data);
return 0;
}
N作为局部的形式变量,并没有返回或者是改变list的这个链表,也就是说N在函数结束之后就被销毁了,而且也不是main函数中list的一个引用。
要是想“引用”,也就是说改变main中的list,一个方法是把list的地址传递到函数内部,而函数的参数表中也需要写成指针类型的,这个指针是(Node *)类型的指针,这里引入了二重指针的概念。这样把list的地址传进去就可以直接添加到list上了。
换句话说,其实问题的本质仍然是swap模型,C传递的是值。
typedef struct Node {
int data;
struct Node* next;
} Node;
void create(Node* *head, int n)
{
*head = malloc(sizeof(Node)); //这里要用*head来分配空间,*head是Node*类型的
(*head)->next = NULL;
Node* new = *head;
Node* p;
for (int i = 0; i < n; ++i) {
p = malloc(sizeof(Node));
scanf("%d", &(p->data));
new->next = p;
new = p;
}
}
int main()
{
Node* list;
create(&list,20); //注意到这里传进去了list的地址
printf("%d", ((list->next)->next)->data);
return 0;
}
链接: