动态链表,写一函数建立一个有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;
};
发布了195 篇原创文章 · 获赞 76 · 访问量 6971

猜你喜欢

转载自blog.csdn.net/qq_45696288/article/details/105266551