| 
 | 
 
 
发表于 2019-3-24 12:22:59
|
显示全部楼层
   本楼为最佳答案    
 
 
 本帖最后由 jackz007 于 2019-3-24 13:39 编辑  
 
      首先应该明白,s 和 s -> next 是同种类型的变量,都是 struct students * 类型,也就是说,他们都是指针类型,在变量定义和初始化的时候,s = NULL 和 s -> next = NULL 意思是,把这 2 个指针初始化为空值,这就意味着,这 2 个指针此刻并没有指向任何一个内存区域,所以,还不能作为结构体用来承载信息和被访问。 
- #include <stdio.h>
 
 - #include <stdlib.h>
 
 - #include <string.h>
 
  
- struct students{
 
 -         char name[10]          ;
 
 -         int num                ;
 
 -         float score            ;
 
 -         struct students * next ;  // 链表节点指针,用于指向下一个节点      
 
 - }                              ;
 
  
- main(void)
 
 - {
 
 -         struct students * s1 , * s2                                 ; // 声明 s1、s2 为链表节点指针
 
 -         s1 = (struct students *) malloc(sizeof(struct students *))  ; // 通过 malloc() 分配一块内存,创建第一个链表节点,用指针 s1 指向这个节点
 
 -         strcpy(s1 -> name , "张三")                                 ; // 为节点 s1 成员赋值
 
 -         s1 -> num   = 102                                           ; // 为节点 s1 成员赋值
 
 -         s1 -> score = 88.5                                          ; // 为节点 s1 成员赋值
 
 -         s1 -> next = NULL                                           ; // 为节点 s1 成员赋值
 
 -         s2 = (struct students *) malloc(sizeof(struct students *))  ; // 通过 malloc() 分配一块内存,创建第二个链表节点,用指针 s2 指向这个节点
 
 -         strcpy(s2 -> name , "李四")                                 ; // 为节点 s2 成员赋值
 
 -         s2 -> num   = 103                                           ; // 为节点 s2 成员赋值
 
 -         s2 -> score = 82.9                                          ; // 为节点 s2 成员赋值
 
 -         s2 -> next = NULL                                           ; // 为节点 s2 成员赋值
 
  
-         s1 -> next = s2                                             ; // 让第节点 s1 的链表指针指向 s2,这样,s1 -> next == s2
 
 -         s2 -> next = s1                                             ; // 让第节点 s2 的链表指针指向 s1,这样,s2 -> next == s1
 
 -                                                                       // 这样,s1 与 s2 形成一个闭环,s1 -> next 指向 s2,而 s1 -> next -> next 又指回了自己
 
 -         printf("s1 -> name  : %s\n" , s1 -> name)                   ; // 利用 s1 向屏幕输出:s1 -> name  : 张三
 
 -         printf("s1 -> num   : %d\n" , s1 -> num)                    ; // 利用 s1 向屏幕输出:s1 -> num   : 102
 
 -         printf("s1 -> score : %4.1f\n , s1 -> score)                ; // 利用 s1 向屏幕输出:s1 -> score : 88.5
 
  
-         printf("s1 -> name  : %s\n" , s2 -> next -> name)           ; // 利用 s2 向屏幕输出:s1 -> name  : 张三
 
 -         printf("s1 -> num   : %d\n" , s2 -> next -> num)            ; // 利用 s2 向屏幕输出:s1 -> num   : 102
 
 -         printf("s1 -> score : %4.1f\n , s2 -> next -> score)        ; // 利用 s2 向屏幕输出:s1 -> score : 88.5
 
 -  
 
 -         free(s1)                                                    ; // 使用完毕释放节点内存
 
 -         free(s2)                                                    ; // 使用完毕释放节点内存
 
 - }
 
 
  复制代码 |   
 
 
 
 |