首先将代码段贴上来: 本文用// 添加注释 因为 #和包含库函数冲突
#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函数结束;
相信写到这里大家都豁然开朗了,主函数就是建立结构体指针然后指向链表表头 调用出第一个链表里成员内容并打印出来!
分析结束! 纯手打,难免有错误,如果您能留言指出,会感激不尽滴!