c链表中指针的一些用法要点
阅读原文时间:2023年07月09日阅读:1

/* 结构体不能含有同类型的结构,但是可以含有指向同类型结构的指针。这样的定义是定义一个链表的基础。 */
1 typedef int Element;
2
3 typedef struct node{
4 Element e;
5 struct node* next;//这里只是声明了一个名为next的指针,指针本身也占内存空间,里面存放的始终是地址。 struct node* 表示指针的类型是 struct node,即指向的地址里存放的是一个结构体
6 }LNode, *Linklist;  //LNode等价于struct node; *LinkList 等价于 struct node* 

  • 等号 = 左右 的 p 和 p->next 意义不同,要注意甄别;

  • pre 单独出现的时候代表一个节点 ,如head,就代表head节点;

  • pre在 = 左边 出现时代表一个节点,在= 右边 出现时代表节点pre的地址;

    •   p = head; //节点p指向节点head的地址
  • p->next 在= 左边 出现时 节点p的指针域;在 = 右边 出现时代表节点 p 的下一个节点地址(即下一节点数据域的地址);

    •   p->next = pre->next; //p 的指针域指向原先 pre 节点的下一个节点地址

    •   pre->next = p; //pre的指针域指向节点 p 的地址

  • 单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是"从指向p的数据域地址变成指向p的指针域地址"

    1 /**
    2 * 插入元素
    3 */
    4 Linklist insert(Linklist head, int k, Element e){
    5 int getLength(Linklist head);
    6
    7 Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
    8 Linklist pre = (Linklist)malloc(sizeof(LNode));//申请一个新节点
    9 int length = getLength(head);
    10 pre = head;
    11
    12 if(k == length+1){ //在链表末尾添加新节点
    13 while(pre->next) {
    14 pre = pre->next; //单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是"从指向p的数据域地址变成指向p的指针域地址" 
    15 }//循环结束时,pre已经到达链表末尾
    16 p->e = e;
    17 pre->next = p;
    18 p->next = NULL;
    19 }else if(k > 0 && k <= length){//在链表中间添加节点 ,插入位置从1开始算 20 int j = 1; 21 while(j < k) { 22 pre = pre->next;//单链表中申请的节点 p 不能使用"p++"操作。p++本身不会出现语法问题,但是并不会"从指向p变成指向p的下一个节点" , 而是"从指向p的数据域地址变成指向p的指针域地址" 
    23 j++;
    24 }//循环结束时,pre是要插入位置的前驱节点
    25 p->e = e;
    26 p->next = pre->next; // p 的指针域指向原先 pre 节点的下一个节点的地址 
    27 pre->next = p; // pre的指针域指向节点 p 的地址
    28 }else{
    29 printf("插入的位置有误!\n");
    30 }
    31 return head;
    32 }