c链表中指针的一些用法要点

/* 结构体不能含有同类型的结构,但是可以含有指向同类型结构的指针。这样的定义是定义一个链表的基础。 */
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 }

 

posted @ 2021-03-02 11:18  sunshine233  阅读(291)  评论(0编辑  收藏  举报