小白初学链表(涉及数组)
超级详细非常适合纯白小白阅读,请各位大佬移步orz
(emm下面代码的注释是我的碎碎念,,可能会帮助到(?) 和昨天的我一样·真·啥也不会 的小白)
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
/*这是一个先输入同学个数(即链表节点数),再分别输入每个同学名字和分数,最后一起输出的蒟蒻程序*/
struct Node{
char name[10];
int score;
struct Node * next; //建立结构体——链表的基本单元
};
int main()
{
struct Node *p,*h; //h is short for head(头节点),p 是一直移动的指针,用来进行操作
int i,n; //计数用的变量
scanf("%d",&n); //链表结点数
h = malloc ( sizeof ( struct Node ) ); //为链表的头结点分配了空间
scanf("%s", h->name ); //没有看错 没有打错,h->name前没有&
//因为name是数组,所以h->name实际上是一个指针,所以不用&来取地址
scanf("%d", &(h->score) ); //h->score相当于一个int,老老实实取地址
p=h;
for(i=1;i<n;i++)
{
p->next = malloc (sizeof(struct Node)); //插入新结点别忘了分配空间
p=p->next; //指针p移向下一个结点
scanf("%s",(p->name)); //继续输入数据
scanf("%d",&(p->score));
}
p->next=NULL; //尾指针设置为为NULL
p=h;
while(p) //当指针不为空
{
printf("%s ",(p->name)); //emm其实这个地方不太明白,好像输出字符型数组的时候
//printf(“%s”,数组名) 和 printf("%s",指向数组的指针) 是等效的
printf("%d\n",p->score);
p=p->next;
}
return 0;
}
样例输入
样例输出
——————————————————————
更新:
①可能遇到的问题:
在有些编译器中为链表结点分配空间时,形如
struct node *head = malloc(sizeof(struct node));
的代码编译会报错(如下图)
②解决方法:
加一个显示类型转换,改成
struct node *head = (struct node*)malloc(sizeof(struct node));
就OK了~