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函数结束;
相信写到这里大家都豁然开朗了,主函数就是建立结构体指针然后指向链表表头 调用出第一个链表里成员内容并打印出来!
分析结束! 纯手打,难免有错误,如果您能留言指出,会感激不尽滴!
- linux 下c语言创建单向动态链表的理解
- C语言 单向链表创建
- C语言下单向链表的排序
- 动态单向链表的创建
- C语言单向链表的实现
- 求助 C语言的单向链表
- C语言实现的单向链表
- 单向链表的C语言实现
- c语言的单向链表
- C语言单向链表的建立
- C语言单向链表的实现
- C语言单向链表的建立
- C语言单向链表的建立
- C语言单向链表的建立
- C语言单向链表的建立
- c语言单向链表的实现
- C语言单向链表的建立
- C语言单向链表的实现
- WPF 简单原生进度条
- 无名管道
- PHP 开发者该知道的 5 个 Composer 小技巧
- 简易的学生成绩录入系统(结构,结构指针,结构数组的运用)
- 375. Guess Number Higher or Lower II
- linux 下c语言创建单向动态链表的理解
- tab选项卡切换(借鉴积累)
- Matlab常用的标记符号和颜色
- JS:类型转换string 转换成为 number
- Assign Cookies
- const int a; int const a; const int *a; int * const a; int const * const a ; const int * const 之间的区别
- kafka安装配置
- redis 介绍
- 回溯法与N皇后问题