关于链表中指针的学习

   昨天晚上在学习数据结构关于链表的部分,理解链表没什么难度,但是当自己动手写程序的时候各种问题就出来了,感觉逻辑很正常但是总得不到正确的结果。

      首先自己对C语言指针理解的不是很深入,在定义链表节点的结构体时,定义了一个指针类型的变量指向结构体如代码所示:  
  
1  typedef int status;
2   typedef struct Node{
3        status data;
4        Node *next;
5   }Node,*linklist;
  然后在main函数中定义一个指向结构体的指针变量如 linklist L;
  在main函数之外声明一个创建链表的函数
  
 1 void Create_list(linklist L1,int n){
 2        linklist p;
 3        L1 = (linklist)malloc(sizeof(Node));
 4        L1->next = NULL;
 5        for(i = 0;i < n; i++){
 6             p = (linklist)malloc(sizeof(Node));
 7             p->data = i;
 8             p->next = L1->next;
 9             L1->next= p;
10        }      
11   }
     Create_list函数采用的事头插法添加链表节点,经过main 函数的调用生成一个链表。但是问题来了当我在使用打印链表的函数进行打印时,链表L是没有值的。我一直想不通,因为上述函数的逻辑是没有错的。为什么会出这样的问题呢。我开始从Main函数进行分析,首先定义linklist L ;然后调用Create_list函数,把指针L传给Create_list中的形参L1(指针类型),指针L和指针L1这两个变量指向同一个地址,但实质上还是两个指针变量,他们在内存中有自己的位置。当执行  L1 = (linklist)malloc(sizeof(Node));这条语句时L1将指向一个新节点的地址,这时L1和L中的保存的地址就已经不同了,接下来的操作都与指针L没有任何关系了,这就是问题的所在。如何解决这个问题呢??
     我们需要将指针L的地址(不是L指向的地址)传过去,这样Create_list函数中形参L1中保存的就是指针L的地址即指向指针的指针。之后用(*L1)的结果就是指向指针L指向的地址,相当于加了一层保护。代码如下:
  
 1 void Create_list(linklist *L1,int n){
 2        linklist p;
 3        (*L1) = (linklist)malloc(sizeof(Node));
 4        (*L1)->next = NULL;
 5      
 6        for(i = 0;i < n; i++){
 7             p = (linklist)malloc(sizeof(Node));
 8             p->data = i;
 9             p->next = (*L1)->next;
10             (*L1)->next= p;
11        }      
12   }
13   Main函数如下:
14   int main(){
15        linklist L;
16        Create_list(&L,5);
17        return 0;
18   }
原文地址:https://www.cnblogs.com/tianshuowang/p/4644725.html