由链表初始化看C语言的二级指针
先来看C语言创建链表、插入节点和遍历链表的一段代码:
[c]
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node{
ElemType elem;
struct Node *next;
}Node, *LinkedList;
//void init_linkedlist(LinkedList *list) {
void init_linkedlist(LinkedList *list) {
*list = (LinkedList)malloc(sizeof(Node));
(*list)->next = NULL;
}
void insert(LinkedList list, ElemType elem) {
Node *p, *q;
q = list;
p = (Node *)malloc(sizeof(Node));
p->elem = elem;
p->next = NULL;
while(q->next != NULL) q = q->next;
q->next = p;
}
void main() {
LinkedList list, p;
init_linkedlist(&list);
insert(list, 3);
insert(list, 4);
insert(list, 5);
p = list->next;
while(p != NULL) {
printf("%4d", p->elem);
p = p->next;
}
printf("\n");
}
这个小程序完成的功能很简单,创建一个链表,然后插入3,4,5这三个整数,最后遍历链表输出每个节点中的整数。但是大家注意到没有,在main函数中,初始化链表的函数参数的是一个二级指针,为什么要使用一个二级指针作为参数呢?在任何一本C语言的教材上,都会写C语言的函数参数传递是值传递方式,所有的参数都是通过值传递的,使用指针作为参数可以在函数中改变参数的值(此处感觉表达有误,但是想不到更好的表达方式)。可能有人会有疑问了,在上面代码的main函数中初始化链表的调用函数代码
[java]
init_linkedlist(&list);
list已经是一个指针了,为什么要传递一个指针的地址,直接使用指针不行吗?确实不行。
补充:软件开发 , C语言 ,