实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)修改之前i=i+1问题

简介: 实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)修改之前i=i+1问题

修改之前的一些小毛病 (很长一段时间都没有检查这个代码,抱歉)

修改位置:在进行查找时将指针p直接指向L->next,避免使用i=i+1

打印删除元素的数据域

查找和删除元素时,P=L,不能出现P=P->next,因为插入删除时可以是在第一个有效数据节点之前,此时的j要保持j=0;

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
typedef int Status;
typedef float ElemType;
typedef struct LNode
{
  ElemType data;
  struct LNode *next;
 } LNode,* LinkList;
LinkList s,r,P;
Status i;
//创建单链表    尾插法 
void CreatListTail(LinkList &L,Status n)
{
  r=L=(LinkList)malloc(sizeof(LNode));
  L->next=NULL;
  for(i=1;i<=n;++i)
  {
    s=(LinkList)malloc(sizeof(LNode));
    scanf("%f",&s->data);
    s->next=NULL;
    r->next=s;
    r=s;
  }
}
//查找 
ElemType GetElem(LinkList &L,Status i)
{
  LinkList P;
  Status j;
  P=L->next;
  j=1;
  while(P&&j<i)
  {
    P=P->next;
    j++;
  }
  return P->data;
}
//插入 
ElemType ListInsert(LinkList &L,int  i,ElemType e)
{
  Status j;
  P=L;
  j=0;
  while(P&&j<i-1)
  {
    P=P->next;
    ++j;
  }
  if(!P||j>i-1)
  {
    return FALSE;
  }
  s=(LinkList)malloc(sizeof(LNode));
  s->data=e;
  s->next=P->next;
  P->next=s;
  return OK;
}
//打印 
void print(LinkList &L)
{
  printf("打印单链表:");
  LinkList P;
  P=L->next;
  while(P!=NULL)
  {
    printf("%.2f ",P->data);
    P=P->next;
  }
  printf("\n");
}
//删除 
Status ListDelete(LinkList &L,int i)
{
  ElemType e;
  Status j;
  LinkList q;
  P=L;
  j=0;
  while(P->next&&j<i-1)
  {
    P=P->next;
    ++j;
  }
  if(!(P->next)||j>i-1)
  {
    return FALSE;
  }
  q=P->next;
  P->next=q->next;
  e=q->data;
  printf("删除的节点数据为:%.2f\n",e);
  free(q);
  return e;
}
//菜单 
menu(LinkList L)
{
  printf("            欢迎您使用单链表操作系统             \n");
  printf("\n");
  printf("*************************************************\n");
  printf("*1:                打印单链表                   *\n");
  printf("-------------------------------------------------\n");
  printf("*2:        查找单链表中某个位置的元素           *\n");
  printf("-------------------------------------------------\n");
  printf("*3:             在单链表中插入元素              *\n");
  printf("-------------------------------------------------\n");
  printf("*4:             在单链表中删除元素              *\n");
  printf("*************************************************\n");
  Status val,n,i;
  ElemType e;
  printf("\n");
  printf("请按下相应数字进行选择:"); 
  scanf("%d",&val);
  switch(val)
  {
    case 1:print(L);
           break; 
      case 2:
         printf("请输入需要查找元素的位置:");
         scanf("%d",&n);
             printf("获取第%d个元素的值为:%.2f\n",n,GetElem(L,n));
             break;
      case 3:
           printf("请输入需要插入的值:");
         scanf("%f",&e);
         printf("请输入插入的位置:");
         scanf("%d",&i); 
             ListInsert(L,i,e);
             print(L);
             break;
      case 4:printf("请输删除的节点位置:");
           scanf("%d",&i); 
           ListDelete(L,i);
           print(L);
           break;
  }
}
int main()
{
  Status n,i,j,k;
  LinkList L,P;
  printf("请输入节点个数:"); 
  scanf("%d",&n);
  printf("创建单链表(输入每个结点的数据域):"); 
  CreatListTail(L,n);
  for(j=0;j<100;j++)
  {
    printf("是否执行程序(1代表继续执行,0代表终止执行)\n");
    scanf("%d",&k);
    if(k==1)
    {
      menu(L);
    }
    else
    {
        break;
    }
  }
  return 0;
}
相关文章
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的自适应学习算法研究与应用
在深度学习领域,传统的静态模型在处理动态环境和非平稳数据时面临挑战。本文探讨了自适应学习算法在深度学习中的重要性及其应用。通过分析自适应学习算法在模型参数、损失函数和数据分布上的应用,展示了其在提升模型鲁棒性和泛化能力方面的潜力。具体讨论了几种代表性的自适应学习方法,并探索了它们在现实世界中的应用案例,从而展示了其在处理复杂问题和动态数据中的效果。
14 0
|
3天前
|
存储 算法
贪心算法的高逼格应用——Huffman编码
贪心算法的高逼格应用——Huffman编码
22 8
|
2天前
|
机器学习/深度学习 数据采集 算法
KNN算法原理及应用(一)
**KNN算法**是一种监督学习的分类算法,适用于解决分类问题。它基于实例学习,无需训练过程,当新样本到来时,通过计算新样本与已有训练样本之间的距离,找到最近的K个邻居,然后根据邻居的类别进行多数表决(或加权表决)来预测新样本的类别。K值的选择、距离度量方式和分类决策规则是KNN的关键要素。KNN简单易懂,但计算复杂度随样本量增加而增加,适用于小规模数据集。在鸢尾花数据集等经典问题上表现良好,同时能处理多分类任务,并可应用于回归和数据预处理中的缺失值填充。
KNN算法原理及应用(一)
|
8天前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
22 7
|
4天前
|
存储 安全 算法
三种常见的加密算法:MD5、对称加密与非对称加密的比较与应用
网络安全聚焦加密算法:MD5用于数据完整性校验,易受碰撞攻击;对称加密如AES快速高效,密钥管理关键;非对称加密如RSA提供身份验证,速度慢但安全。三种算法各有所长,适用场景各异,安全与效率需权衡。【6月更文挑战第17天】
16 2
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
11 1
|
6天前
|
机器学习/深度学习 算法 Python
【算法】深入浅出爬山算法:原理、实现与应用
【算法】深入浅出爬山算法:原理、实现与应用
14 3
|
5天前
|
传感器 人工智能 运维
智慧电厂转动设备的“非停监测”及算法应用
转动设备故障预测技术在智慧电厂中至关重要,防止非计划停机能避免经济损失和安全风险。结合传统数学模型与AI大数据分析,通过高精度传感器实时监测设备参数,利用智能算法精准预测异常,提前预警潜在故障。AI驱动的模型不仅能识别已知故障,还能预测未知问题,优化维护决策,减少停机时间,降低成本,增强可再生能源设施的运维效率,推动绿色能源转型。
|
6天前
|
机器学习/深度学习 算法 Python
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。
|
11天前
|
机器学习/深度学习 算法 前端开发
决策树与随机森林算法在分类问题中的应用
本文探讨了决策树和随机森林两种监督学习算法,它们在分类任务中表现出强大的解释性和预测能力。决策树通过特征测试进行分类,构建涉及特征选择、树生成和剪枝。随机森林是集成学习方法,通过构建多棵决策树并汇总预测结果,防止过拟合。文中提供了Python代码示例,展示如何使用sklearn构建和应用这些模型,并讨论了参数调优和模型评估方法,如交叉验证和混淆矩阵。最后,强调了在实际问题中灵活选择和调整模型参数的重要性。
35 4