C语言:单链表的查询操作,查询链表的某一结点。

简介: C语言:单链表的查询操作,查询链表的某一结点。

目录

老规矩,先看看结果是不是你想要的:

代码分析:

第一步:声明

第二步:输入函数

第三步:(关键)查询操作的函数

第四步:输出

第五步:主函数

完整代码:


 

老规矩,先看看结果是不是你想要的:



代码分析:

       注:由于输入与输出函数与单链表的删除与插入相同,所以这里不在一一解释!

第一步:声明

#include<stdio.h>
#include<stdlib.h>
struct student     //声明结构体类型
{
  int num;
  float score;
  struct student *next;
};
int n; //全局变量
struct student *h;//此处不同,这里的链表为全局变量


第二步:输入函数

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 *refers(struct student *hl)
{
  struct student* p1, * p2, * p0; //声明结构体类型的变量
  int num; 
  int ch;
  p0 = NULL; //初始化为NULL
  while (1)
  {
    p1 = p2 = hl; //此处需要注意,不能放在while的外面
    printf("\n你是否需要查询(Y/N):");
    do {
      ch = getchar();
    } while (ch != 'Y' && ch != 'N'); //当输入不符时,循环输入
    if (ch == 'Y') 
    {
      printf("\n请输入你要查询的学号:");
      scanf("%d", &num); //满足条件开始输入
      while (p1->num != num && p1->next != NULL) //判断结点在何处
      {
        p2 = p1;
        p1 = p1->next;
      }
      if (p1->num == num) //结点处
      {
        p0 = p1; //将p1的数据赋值给p0
        printf("\n你的查询结果:"); 
        printf("\n\t学号:\t成绩:");
        printf("\n\t%d\t%.2f", p0->num, p0->score); //直接打印结果
      }
      else
      {
        printf("未找到相关数据!"); 
      }
    }
    else {
      printf("\n你已退出查询!");
      break;  //此处退出循环
    }
  }
  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 *refers(struct student *hl); 
  void print(struct student *h);
  h=creat();
  print(h);
  refers(h); //直接调用函数即可
  return 0;
}

完整代码:

#include<stdio.h>
#include<stdlib.h>
struct student 
{
  int num;
  float score;
  struct student *next;
};
int n;
struct student *h;
int main()
{
  struct student *creat();
  struct student *refers(struct student *hl); 
  void print(struct student *h);
  h=creat();
  print(h);
  refers(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 *refers(struct student *hl)
{
  struct student* p1, * p2, * p0;
  int num;
  int ch;
  p0 = NULL;
  while (1)
  {
    p1 = p2 = hl;
    printf("\n你是否需要查询(Y/N):");
    do {
      ch = getchar();
    } while (ch != 'Y' && ch != 'N');
    if (ch == 'Y')
    {
      printf("\n请输入你要查询的学号:");
      scanf("%d", &num);
      while (p1->num != num && p1->next != NULL)
      {
        p2 = p1;
        p1 = p1->next;
      }
      if (p1->num == num)
      {
        p0 = p1;
        printf("\n你的查询结果:");
        printf("\n\t学号:\t成绩:");
        printf("\n\t%d\t%.2f", p0->num, p0->score);
      }
      else
      {
        printf("未找到相关数据!");
      }
    }
    else {
      printf("\n你已退出查询!");
      break;
    }
  }
  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);
  }
}


相关文章
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
4186 6
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
602 5
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
1820 4
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
1058 2
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
200 0
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
222 1
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
642 0
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
286 0
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
947 23
|
10月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1560 0