C语言使用引用传递反而报错
以下是我第一遍写的,成功运行的文件
/**
* 说明:王道版数据结构,LNode *, LinkList两个东西虽然实际表示的东西是一样的,
* 但是LNode *强调这是一个结点的指针,LinkList则表示一个链表(头指针、头结点的指针)
* 其次,王道版链表是带头结点的
*/
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
typedef struct LNode { // 定义单链表结点类型
int data; // 每个结点存放一个数据元素
struct LNode *next; // 指针指向下一个结点
} LNode, *LinkList;
// 初始化一个单链表(带头结点)
LinkList initList(LinkList L) {
L = (LNode *) malloc(sizeof(LNode)); // 分配一个头结点
L->data = 999;//头结点的数据域可以没有,也可以是别的,比如可以是链表长度
if (L == NULL) { // 内存不足,分配失败
printf("L == NULL");
return 0;
}
L->next = NULL; // 头结点之后暂时还没有结点
return L;
}
/**
* 在第i个位置插入元素e(带头结点)
*/
bool ListInsert(LinkList L, int i, int e) {
if (i < 1) {
printf("i < 1");
return 0;
}
LNode *p; // 创建一个当前指向的结点
p = L; // 初始化指向到头结点
int j = 1;
//将p指向某结点,该结点后面要插入新结点
while (j < i) {
p = p->next;
j++;
}
LNode *s; // 新建一个待插入的新节点
s = (LNode *) malloc(sizeof(LNode)); // 给新节点分配内存
s->data = e; // 给新节点放入数据
s->next = p->next; // 新节点指向当前结点的下一个结点
p->next = s; // 原结点指针改为指向到新创建的结点
}
void readAll(LinkList L) {
LNode *p;
p = L;
while (p->next != NULL) {
p = p->next;
printf("%d \n", p->data);
}
}
void deleteItem(LinkList L, int i) {
int j;
LNode *s;
s = L;
for (j = 0; j < i - 1; j++) {
s = s->next;
}
LNode *t = s->next;
s->next = s->next->next;
free(t);
}
int main() {
LinkList L;
// LNode L;
L = initList(L);
ListInsert(L, 1, 111);
ListInsert(L, 1, 222);
ListInsert(L, 1, 333);
printf("三次插入后的结果\n");
readAll(L);
printf("删除后的结果\n");
deleteItem(L, 2);
readAll(L);
return 0;
}
注意到王道书上有一个细节,在需要更改链表本身的时候,在参数列表里会增加一个取地址符,但是我加上之后编译器反而报错了
还是不明白这里为什么要加取地址符,我们本身传递进去的就是一个指针变量(LinkList),输入指针变量已经是引用传递了吧?