实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)

简介: 实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)

1.实验名称

线性表的基本操作及应用

2.实验目的

(1)掌握单链表的创建,插入、删除、查找和打印算法;

(2)运用线性表解决线性结构问题。

3.实验内容

基本要求:

(1)实现单链表的创建;(2)实现单链表的插入;(3)实现单链表的删除

(4)实现单链表的查找;(5)实现单链表的显示;

选作内容:

两个线性表合并算法的实现。已知顺序表LA和LB中的数据元素按值非递减有序排列,现要将LA和LB归并为一个新的顺序表LC,且LC中的数据元素仍按值非递减有序排序。例如:LA=(3,5,8,11) LB=(2,6,9,15,20)。


实验代码(线性表的基本操作):

#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)
{
  i=i+1; 
  LinkList P;
  Status j;
  P=L;
  j=1;
  while(P&&j<i)
  {
    P=P->next;
    j++;
  }
  return P->data;
}
//插入 
ElemType ListInsert(LinkList &L,int  i,ElemType e)
{
  i=i+1;
  Status j;
  P=L;
  j=1;
  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)
{
  i=i+1;
  ElemType e;
  Status j;
  LinkList q;
  P=L;
  j=1;
  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;
  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;
}


控制台:

image.png

相关文章
|
3天前
|
存储 算法
贪心算法的高逼格应用——Huffman编码
贪心算法的高逼格应用——Huffman编码
22 8
|
2天前
|
机器学习/深度学习 数据采集 算法
KNN算法原理及应用(一)
**KNN算法**是一种监督学习的分类算法,适用于解决分类问题。它基于实例学习,无需训练过程,当新样本到来时,通过计算新样本与已有训练样本之间的距离,找到最近的K个邻居,然后根据邻居的类别进行多数表决(或加权表决)来预测新样本的类别。K值的选择、距离度量方式和分类决策规则是KNN的关键要素。KNN简单易懂,但计算复杂度随样本量增加而增加,适用于小规模数据集。在鸢尾花数据集等经典问题上表现良好,同时能处理多分类任务,并可应用于回归和数据预处理中的缺失值填充。
KNN算法原理及应用(一)
|
2天前
|
算法 索引
DFS算法及应用(二)
回溯:回溯就是DFS的一种,在搜索探索过程中寻找问题的解,当发现不满足求解条件时,就回溯返回,尝试其他路径。
|
2天前
|
算法
DFS算法及应用(一)
DFS(深度优先搜索)是一种图遍历算法,常用于解决穷举问题,如全排列、迷宫问题、图的连通性等。它沿着树的深度分支进行探索,直至达到叶子节点,若无法继续则回溯。例如,将数字6拆分为3个正整数的递增序列问题可以通过DFS实现,类似地,分糖果问题和买瓜问题同样可以用DFS求解。DFS通常涉及递归或栈结构,通过标记已访问节点避免重复。在编程中,会定义递归函数,设定结束条件,然后枚举可能的情况,并处理下一层节点。
|
2天前
|
算法
KNN算法原理及应用(二)
不能将所有数据集全部用于训练,为了能够评估模型的泛化能力,可以通过实验测试对学习器的泛化能力进行评估,进而做出选择。因此需要使用一个测试集来测试学习器对新样本的判别能力。
|
4天前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】Apriori算法在关联规则学习中的应用
【机器学习】Apriori算法在关联规则学习中的应用
18 0
|
4天前
|
机器学习/深度学习 人工智能 算法
【机器学习】基于核的机器学习算法应用
【机器学习】基于核的机器学习算法应用
13 0
|
1天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
4天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
19 6
|
1天前
|
缓存 算法
基于机会网络编码(COPE)的卫星网络路由算法matlab仿真
**摘要:** 该程序实现了一个基于机会网络编码(COPE)的卫星网络路由算法,旨在提升无线网络的传输效率和吞吐量。在MATLAB2022a中测试,结果显示了不同数据流个数下的网络吞吐量。算法通过Dijkstra函数寻找路径,计算编码机会(Nab和Nx),并根据编码机会减少传输次数。当有编码机会时,中间节点执行编码和解码操作,优化传输路径。结果以图表形式展示,显示数据流与吞吐量的关系,并保存为`R0.mat`。COPE算法预测和利用编码机会,适应卫星网络的动态特性,提高数据传输的可靠性和效率。