linux 下c语言创建单向动态链表的理解

来源:互联网 发布:c语言中x a 3 b a 编辑:程序博客网 时间:2024/05/16 05:07

首先将代码段贴上来:  本文用// 添加注释 因为 #和包含库函数冲突

#include <stdio.h>
#include <malloc.h>              //分配内存要加上这个库函数
struct weapon {
  int price;
  int atk;
  struct weapon* next;
};  //创建一个武器库的结构体,记得创建完成之后要加; 如果想要实例化可以在后面直接跟结构体变量名称

//接下来的就是动态创建单项链表的函数
struct weapon * creat ()
{
 struct weapon * p1,*p2,*head;  //创建三个 struct weapon * 类型的指针
 int n=0; //创建计数变量
 head=NULL; //链表头暂时为空
 p1=p2=(struct weapon *)malloc(sizeof(struct weapon)); //使用malloc分配sizeof(struct weapon)大小的内存空间
 scanf("%d,%d",&(p1->price),&(p1->atk));
 while((p1->price)!=0)
 {
   n++;
  if(n==1)
     head=p1;
  else
     p2->next=p1;
     p2=p1;

     

  p1=(struct weapon *)malloc(sizeof(struct weapon));

  scanf("%d,%d",&(p1->price),&(p1->atk));
 }
 p2->next=NULL;
 return (head);

}

/***********************主函数中的对创建链表的调用*******************/

int main()

{
 struct weapon *p;
 p=creat();
  if(p!=NULL)
   printf("%d,%d\n",(p->price),(p->atk));


}

   解释:最难理解的就是create()这个函数里面的一些内容;下面对本函数的难懂部分进行解释


 首先创建struct weapon *类型的指针  p1,p2,head;

  接下来这个p1,p2用作指向前一个和后一个链表块,而这个head是用来存放生成链表的链表头

 然后malloc一个size of(struct weapon)大小的内存空间,并且让p1和p2 都指向这个内存空间

 等待用户输入,将用户输入的内容存储到p1->price 和 p1->atk当中去 (这个p1->price 的写法实际上就是 等价于(*p1).price)

 然后进行判断,p1->price 是否为零 如果不是持续循环


 接下来看循环体部分的内容:

  n++;先让n自增,然后判断n的值,如果等于1.说明是第一次进入这个循环体,那么就将刚刚写入数据的p1当作是head的头 链表头! 第一次来嘛,肯定首先第一个写入数据的结构体当作链表头。

   如果不是的话, 将p1的地址赋给p2->next; (这里可能有同学不理解,不是刚开始p1和p2 都是同一个地址吗?就是哪个刚分配的内存空间,错到是没错,但是那是建立在n==1的基础上,此时n!=1,也就是明显循环体已经开始了,所以p2的含义可以继续往下找)

   p2=p1; 这个地方问题来了,p1是刚刚链入链表的最后一个结构体,让p2=p1 立马更新p2的值就是想告诉我们,p2的含义很简单就是一直等于链表的最后一个结构体地址,所以上面的那条语句可以解释的通了,上条语句的内容就是将p1的结构体内容链接进链表;


  最后给p1开辟空间,输入数据, 然后将head的内容返回 ;

 create函数结束;

  相信写到这里大家都豁然开朗了,主函数就是建立结构体指针然后指向链表表头 调用出第一个链表里成员内容并打印出来!


  分析结束!   纯手打,难免有错误,如果您能留言指出,会感激不尽滴!

0 0
原创粉丝点击