链表中指针的一些用法要点
约 754 字大约 3 分钟
2025-06-20
/* 结构体不能含有同类型的结构,但是可以含有指向同类型结构的指针。这样的定义是定义一个链表的基础。 */1 typedef int Element;
typedef struct node{
Element e;
struct node* next;//这里只是声明了一个名为next的指针,指针本身也占内存空间,里面存放的始终是地址。 struct node* 表示指针的类型是 struct node,即指向的地址里存放的是一个结构体
}LNode, *Linklist; //LNode等价于struct node; *LinkList 等价于 struct node*
等号 = 左右 的
p
和p->next
意义不同,要注意甄别;pre
单独出现的时候代表一个节点 ,如head
,就代表head节点
;pre在 = 左边 出现时代表一个节点,pre在= 右边出现时代表节点pre的地址;
p = head; //节点p指向节点head的地址
p->next 在= 左边 出现时代表节点p的指针域;p->next在 = 右边出现时代表节点 p 的下一个节点地址(即下一节点数据域的地址);
p->next = pre->next; //p 的指针域指向原先 pre 节点的下一个节点地址
pre->next = p; //pre的指针域指向节点 p 的地址
单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是**"从指向p的数据域地址变成指向p的指针域地址"** 。
/**
* 插入元素
*/
Linklist insert(Linklist head, int k, Element e){
int getLength(Linklist head);
Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
Linklist pre = (Linklist)malloc(sizeof(LNode));//申请一个新节点
int length = getLength(head);
pre = head;
if(k == length+1){ //在链表末尾添加新节点
while(pre->next) {
pre = pre->next; //单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是"从指向p的数据域地址变成指向p的指针域地址"
}//循环结束时,pre已经到达链表末尾
p->e = e;
pre->next = p;
p->next = NULL;
}else if(k > 0 && k <= length){//在链表中间添加节点 ,插入位置从1开始算
int j = 1;
while(j < k) {
pre = pre->next;//单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是"从指向p的数据域地址变成指向p的指针域地址"
j++;
}//循环结束时,pre是要插入位置的前驱节点
p->e = e;
p->next = pre->next; // p 的指针域指向原先 pre 节点的下一个节点的地址
pre->next = p; // pre的指针域指向节点 p 的地址
}else{
printf("插入的位置有误!\n");
}
return head;
}