C语言:单链表的循环添加、插入操作,直到不在插入为止

简介: C语言:单链表的循环添加、插入操作,直到不在插入为止

目录

老规矩,先看结果:

代码分析:

第一步:声明

第二步:输入函数

第三步:添加函数

第四步:输出函数

第五步:主函数

完整的代码:



老规矩,先看结果:



代码分析:

第一步:声明

#include<stdio.h>
#include<stdlib.h>
struct student  //声明结构体类型
{
  int num;
  float score;
  struct student *next;
};
int n; //全局变量


第二步:输入函数

struct student *creat()
{
  struct student *head;  
  struct student *p1,*p2; //声明结构体类型变量
  p1=(struct student *)malloc(sizeof(struct student)); //开辟新的空间
  p2=p1;  //赋值
  printf("请输入学生学号、成绩 :");
  scanf("%d%f",&p1->num,&p1->score); //输入数据
  head=NULL; //赋初始值
  n=0; //赋初始值
  while(p1->num!=0) //循环输入
  {
    n++; //记录结点数
    if(n==1) //头结点
    {
      head=p1; //赋值
    }
    else
    {
      p2->next=p1; //p2指针指向p1
    }
    p2=p1; //赋值
    p1=(struct student *)malloc(sizeof(struct student)); //又开辟新的空间
    printf("请输入学生学号、成绩:");
    scanf("%d%f",&p1->num,&p1->score); //输入
  }
  p2->next=NULL; //结尾为NULL
  return head; //返回头指针
}

第三步:添加函数

struct student *add(struct student *h,int num,float score)
{
  struct student *p1,*p2,*New; //声明结构体变量
  p1=h; //p1开始指向头指针h
  p2=NULL; //p2不动,初始化为NULL
  while(p1!=NULL&&p1->num<num) //判断结点在何处
  {
    p2=p1;
    p1=p1->next;
  }
  New=(struct student *)malloc(sizeof(struct student)); //开辟新的空间
  New->num=num; //输入的数据给相应的结点
  New->score=score; //输入的数据给相应的结点
  New->next=p1; //由于结点已找到,所以New的尾部可以指向p1
  if(p2==NULL) //p2未动,说明在头部
  {
    h=New; //将New的头部赋值给h
  }
  else
  {
    p2->next=New; //否则为中间或结尾,将New的头部赋值给p2的尾部
  }
  return h; //返回新的链表
}

第四步:输出函数

void print(struct student *h)
{
  struct student *p;
  p=h;
  if(h!=NULL) //判断是否为空指针
  {
    printf("\n结果是:");
    do{
      printf("\n\t%d\t%.2f",p->num,p->score); //循环输出
      p=p->next;
    }while(p!=NULL);
  }
}

第五步:主函数

int main()
{
  struct student *creat(); //输入函数声明
  struct student *add(struct student *h,int num,float score); //插入函数声明
  void print(struct student *h); //输出函数声明
  struct student *h; 
  int num;
  float score;
  int ch;
  h=creat(); //调用输入函数
  print(h); //调用输出函数,打印结果
  while(1) //外循环,判断是否要添加数据
  {
    printf("\n你是否需要添加数据:"); 
    do{
      ch=getchar();
    }while(ch!='Y'&&ch!='N'); //用do——while循环判断,如果输入错误,再次输入
    if(ch=='Y') 
    {
      printf("\n请你输入要加入的学生学号:");
      scanf("%d",&num); //输入要添加的数据
      printf("请你输入要加入的学生成绩:");
      scanf("%f",&score); //输入要添加的数据
      h=add(h,num,score); //调用添加函数
      print(h);
    }
    else
    {
      break; //如果不添加,则跳出
    }
  }
  printf("添加完毕!");
  printf("最终数据为:\n");
  print(h);
  return 0;
}

 


完整的代码:

 

#include<stdio.h>
#include<stdlib.h>
struct student 
{
  int num;
  float score;
  struct student *next;
};
int n;
int main()
{
  struct student *creat();
  struct student *add(struct student *h,int num,float score);
  void print(struct student *h);
  struct student *h;
  int num;
  float score;
  int ch;
  h=creat();
  print(h);
  while(1)
  {
    printf("\n你是否需要添加数据:");
    do{
      ch=getchar();
    }while(ch!='Y'&&ch!='N');
    if(ch=='Y')
    {
      printf("\n请你输入要加入的学生学号:");
      scanf("%d",&num);
      printf("请你输入要加入的学生成绩:");
      scanf("%f",&score);
      h=add(h,num,score);
      print(h);
    }
    else
    {
      break;
    }
  }
  printf("添加完毕!");
  printf("最终数据为:\n");
  print(h);
  return 0;
}
struct student *creat()
{
  struct student *head;
  struct student *p1,*p2;
  p1=(struct student *)malloc(sizeof(struct student));
  p2=p1;
  printf("请输入学生学号、成绩 :");
  scanf("%d%f",&p1->num,&p1->score);
  head=NULL;
  n=0;
  while(p1->num!=0)
  {
    n++;
    if(n==1)
    {
      head=p1;
    }
    else
    {
      p2->next=p1;
    }
    p2=p1;
    p1=(struct student *)malloc(sizeof(struct student));
    printf("请输入学生学号、成绩:");
    scanf("%d%f",&p1->num,&p1->score);
  }
  p2->next=NULL;
  return head;
}
struct student *add(struct student *h,int num,float score)
{
  struct student *p1,*p2,*New;
  p1=h;
  p2=NULL;
  while(p1!=NULL&&p1->num<num)
  {
    p2=p1;
    p1=p1->next;
  }
  New=(struct student *)malloc(sizeof(struct student));
  New->num=num;
  New->score=score;
  New->next=p1;
  if(p2==NULL)
  {
    h=New;
  }
  else
  {
    p2->next=New;
  }
  return h;
}
void print(struct student *h)
{
  struct student *p;
  p=h;
  if(h!=NULL)
  {
    printf("\n结果是:");
    do{
      printf("\n\t%d\t%.2f",p->num,p->score);
      p=p->next;
    }while(p!=NULL);
  }
}


相关文章
|
1月前
|
C语言
初识C语言2——分支语句和循环语句
初识C语言2——分支语句和循环语句
69 5
|
2月前
|
安全 C语言
C语言循环的使用注意点
在C语言中,合理使用循环对于编写高效、安全的代码至关重要。以下是几点建议:确保循环条件正确以避免无限循环;每次迭代时正确更新循环变量;恰当使用`break`和`continue`控制执行流程;注意嵌套循环中的变量作用域;简化循环体内逻辑;根据需求选择合适的循环类型;注意数据类型以避免溢出;保持良好的缩进和注释习惯;减少重复计算以提升性能;确保循环终止条件明确。遵循这些建议,可以提高代码质量和可维护性。
214 88
|
20天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
48 4
|
30天前
|
C语言
【c语言】循环语句
循环结构是C语言中用于简化重复操作的重要工具,主要包括while循环、do-while循环和for循环。while循环是最基本的形式,通过不断检查条件来决定是否继续执行循环体。do-while循环则先执行循环体,再检查条件,至少执行一次。for循环逻辑更复杂,但使用频率最高,适合初始化、条件判断和更新变量的集中管理。此外,循环中还可以使用break和continue语句来控制循环的提前终止或跳过当前迭代。最后,循环可以嵌套使用,解决更复杂的问题,如查找特定范围内的素数。
37 6
|
1月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
1月前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
27 0
|
1月前
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
17 1
|
1月前
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
23 1
|
20天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
39 0
|
1月前
|
存储 C语言
C语言单链表实现
一个用C语言编写的简单学生信息管理系统,该系统具备信息输入、成绩计算、排序、删除、查找、修改、保存和读取文件等功能。
23 0
C语言单链表实现