(第19列)C语言:单链表删除操作,循环删除,直到不想再删除为止。

简介: (第19列)C语言:单链表删除操作,循环删除,直到不想再删除为止。

先看结果,是不是你们想要的:

我们还是一步一步的来:(完整代码在最后!)



第一步:

1、预处理命令:

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)

2、结构体类型:

struct student 
{
  int num;
  float score;
  struct student *next;
};

3、声明:

    struct student *creat();//输入函数,用于输入数据
  struct student *del(struct student *head,int sum);//删除函数,用于删除数据
  void print(struct student *head);//输出函数,用于输出数据


第二步:输入函数

struct student *creat()
{
  struct student *head,*p1,*p2;  //在函数中定义结构体变量
  p2=p1=(struct student *)malloc(LEN); //开辟新的空间
  printf("请输入学生学号、成绩:");
  scanf("%d%f",&p1->num,&p1->score); //第一次输入
  n=0;    //全局变量n 
  head=NULL; //头指针首先不指向任何数据
  while(p1->num!=0) //输入的数据为0,则停止循环
  {
    n++; //循环一次,数据就加一组,可以判断数据有多少组
    if(n==1) //第一组数据时
    {
      head=p1; //头指针指向第一组数据
    }
    else 
    {
      p2->next=p1; //否则p2的next指向下一组数据
      }
      p2=p1;  //前面是指向下一组数据的开头,现在是把下一组数据都赋值给p2
      p1=(struct student *)malloc(LEN);  //重新开辟空间
      printf("请输入学生学号、姓名:");
      scanf("%d%f",&p1->num,&p1->score); //继续输入
  }
  p2->next=NULL;  //最后一组数据的尾部为NULL
  return head;  //返回头指针
}


第三步:删除函数

struct student *del(struct student *head,int sum)
{
  struct student *p1,*p2;  //重新定义变量,与输入函数的p1,p2不同,是独立不联系的
  p2=p1=head;    //p1,p2指向链表的头部
    while(p1->num!=sum&&p1->next!=NULL) //循环查找要删除的结点
    {
      p2=p1;
      p1=p1->next;
    }
    if(p1->num==sum) //如果有要删除的结点
    {
      if(p1==head) //此结点在头部
      {
        head=p1->next; 
      }
      else //此结点在中间或尾部
      {
        p2->next=p1->next;
      }
    }
    else //没有要删除的结点
    {
      printf("未找到数据!"); 
    }
  return head; //返回更新过后的链表
}


第四步:输出

void print(struct student *h1)
{
  struct student *p;  //定义结构体类型
  p=h1;  //头指针给p
  if(h1!=NULL) //如果指针不为空
  {
    printf("\n结果为:\n");
    do
    {
      printf("\t%d\t%.2f\n",p->num,p->score);
      p=p->next;
    }while(p!=NULL); //do...while循环打印结果
  }
}


第五步:主函数main中实现无限循环

int ch;
while(1) //无限循环
  {
    printf("\n你是否需要删除数据(Y/N):");
    do
    {
      ch=getchar(); //输入单个字母(Y/N)
    }while(ch!='Y'&&ch!='N');  //如果不为指定字母,则持续输入
    if(ch=='Y') //符合yes
    {
      printf("请输入你要删除的数据:");
      scanf("%d",&sum);  //输入数据
      h1=del(h1,sum); //删除数据
      print(h1);  //打印删除后的结果
    }
    else
    {
      break;  //如果为no,则跳出循环
    }
  }

完整代码:

代码来了!

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


相关文章
|
7天前
|
安全 C语言
C语言循环的使用注意点
在C语言中,合理使用循环对于编写高效、安全的代码至关重要。以下是几点建议:确保循环条件正确以避免无限循环;每次迭代时正确更新循环变量;恰当使用`break`和`continue`控制执行流程;注意嵌套循环中的变量作用域;简化循环体内逻辑;根据需求选择合适的循环类型;注意数据类型以避免溢出;保持良好的缩进和注释习惯;减少重复计算以提升性能;确保循环终止条件明确。遵循这些建议,可以提高代码质量和可维护性。
183 88
|
2月前
|
C语言
【C语言】循环语句
C语言中循环语句的相关知识点
29 2
【C语言】循环语句
|
3月前
|
C语言
【C语言基础】:分支与循环
【C语言基础】:分支与循环
|
8天前
|
C语言
【C语言基础考研向】08判断语句与循环语句
本文介绍了C语言中的关键编程概念:首先解析了关系表达式与逻辑表达式的优先级及计算过程;接着详细说明了`if-else`语句的使用方法及其多分支和嵌套应用;然后讲解了`while`循环与`for`循环的语法和注意事项;最后介绍了`continue`和`break`语句在控制循环中的作用和示例代码。
|
11天前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
|
11天前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
11天前
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。
|
1月前
|
机器学习/深度学习 C语言
【C语言篇】循环语句详解(超详细)
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳出循环.
|
1月前
|
C语言
C语言的循环语句
C语言的循环语句
40 6
|
3月前
|
C语言
C语言循环与分支
C语言循环与分支
37 5