动态链表,写一函数建立一个有n名学生数据的单向动态链表。

#include <stdio.h> 
#include <stdlib.h> 
//动态链表
//每次建立新结点的时候都认为新结点是链 
//如果再开辟内存时,那么之前的结点的next域就会改变值,指向新开辟的结点,而此时新开辟的结点又变成链尾 
struct Student
{ int num;
   float score;
};
struct Node//Node代表结点 
{
 struct Student stu;
 struct Node *next; 
};
int main()
{
 struct Node *n;
 struct Node *p;
 struct Node *head=NULL;
 int m;//代表结点的个数 
 printf("请输入结点的总个数:");
 scanf("%d",&m);
 //第一个结点 
   n=(struct Node *)malloc(sizeof(struct Node));//开辟一个新的内存空间 
   printf("请输入第1个学生的学号和成绩:"); 
   scanf("%d %f",&n->stu.num,&n->stu.score);
 n->next=NULL;//相当于静态链表时候的初始化 
 p=n;//p指向n的地址,可发生改变 
 head=n; //定海神针  , 代表第一个结点n的地址,不发生改变 
 for(int i=1;i<m;i++){//注意for(p=n;p!=NULL;p=p->next)是死循环 ,因为没有终止条件 
  n=(struct Node *)malloc(sizeof(struct Node));
  printf("请输入第%d个学生的学号和成绩:",i+1);
  scanf("%d %f",&n->stu.num,&n->stu.score);
 n->next=NULL;//相当于静态链表时候的初始化 
 p->next=n;//将n的地址传过去 
 p=n;
 }
 p=head;
   do        
   {printf("学号:%ld    成绩:%5.1f\n",p->stu.num,p->stu.score);
     p=p->next;   
  }while(p!=NULL);   
   return 0;
}


输出显示:
请输入结点的总个数:3
请输入第1个学生的学号和成绩:1234 87.8
请输入第2个学生的学号和成绩:2234 98.3
请输入第3个学生的学号和成绩:3234 88.5
学号:1234    成绩: 87.8
学号:2234    成绩: 98.3
学号:3234    成绩: 88.5
方法二:将第一个结点与第二个结点写到一起
#include <stdio.h> 
#include <stdlib.h> 
//动态链表
//每次建立新结点的时候都认为新结点是链 
//如果再开辟内存时,那么之前的结点的next域就会改变值,指向新开辟的结点,而此时新开辟的结点又变成链尾 
struct Student
{ int num;
   float score;
};
struct Node//Node代表结点 
{
 struct Student stu;
 struct Node *next; 
};
int main()
{
 struct Node *n;
 struct Node *p;
 struct Node *head=NULL;
 int m;//代表结点的个数 
 printf("请输入结点的总个数:");
 scanf("%d",&m);
 for(int i=0;i<m;i++)
 {
  n=(struct Node *)malloc(sizeof(struct Node));
   printf("请输入第%d个学生的学号和成绩:",i+1);
  scanf("%d %f",&n->stu.num,&n->stu.score);
    if(head==NULL)//如果是第一个结点 
    {
     head=n;//p指向n的地址,可发生改变 
     p=n;//定海神针  , 代表第一个结点n的地址,不发生改变
    }else{
     p->next=n;//让第二个结点链接到第一个结点的next中
        p=n;//将n的地址传过去 
    }
  }
 p=head;
   do        
   {printf("学号:%ld    成绩:%5.1f\n",p->stu.num,p->stu.score);
     p=p->next;   
  }while(p!=NULL);   
   return 0;
}


输出显示:
请输入结点的总个数:3
请输入第1个学生的学号和成绩:234 67.8
请输入第2个学生的学号和成绩:345 56.9
请输入第3个学生的学号和成绩:456 76.5
学号:234    成绩: 67.8
学号:345    成绩: 56.9
学号:456    成绩: 76.5
注意:
struct Student
{ int num;
   float score;
};
struct Node
{
 struct Student stu;
 struct Node *next; 
};
可以改写为下面的格式
struct Student
{ int num;
   float score;
   struct Student *next;
};
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值