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);
  }
}


相关文章
|
4月前
|
C语言
初识C语言2——分支语句和循环语句
初识C语言2——分支语句和循环语句
94 5
|
1月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
51 19
|
1月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
77 18
|
1月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
57 18
|
1月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
52 13
|
1月前
|
存储 C语言
【C语言程序设计——循环程序设计】利用数列的累加和求 sinx(头歌实践教学平台习题)【合集】
项的累加和,一般会使用循环结构,在每次循环中计算出当前项的值(可能基于通项公式或者递推关系),然后累加到一个用于存储累加和的变量中。在C语言中推导数列中的某一项,通常需要依据数列给定的通项公式或者前后项之间的递推关系来实现。例如,对于一个简单的等差数列,其通项公式为。的级数,其每一项之间存在特定的递推关系(后项的分子是其前项的分子乘上。,计算sinx的值,直到最后一项的绝对值小于。为项数),就可以通过代码来计算出指定项的值。对于更复杂的数列,像题目中涉及的用于近似计算。开始你的任务吧,祝你成功!
51 6
|
1月前
|
C语言
【C语言程序设计——循环程序设计】鸡兔同笼问题(头歌实践教学平台习题)【合集】
本教程介绍了循环控制和跳转语句的使用,包括 `for`、`while` 和 `do-while` 循环,以及 `break` 和 `continue` 语句。通过示例代码详细讲解了这些语句的应用场景,并展示了如何使用循环嵌套解决复杂问题,如计算最大公因数和模拟游戏关卡选择。最后,通过鸡兔同笼问题演示了穷举法编程的实际应用。文中还提供了编程要求、测试说明及通关代码,帮助读者掌握相关知识并完成任务。 任务描述:根据给定条件,编写程序计算鸡和兔的数量。鸡有1个头2只脚,兔子有1个头4只脚。
57 5
|
2月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
776 6
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
166 4

热门文章

最新文章