【Dev-c++】C语言数据结构实验——线性表

这篇具有很好参考价值的文章主要介绍了【Dev-c++】C语言数据结构实验——线性表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验一 线性表

一、实验目的

    1、深刻理解线性结构的特点,以及在计算机内的两种存储结构。

    2、熟练掌握线性表的顺序存储结构和链式存储结构,及其它们的基本操作,重点掌握查找、插入和删除等操作。

二、实验要求

    1、认真阅读程序,将未完成的代码补全(红色部分)。

2、上机调试,并运行程序。

3、保存和截图程序的运行结果,并结合程序进行分析。

三、实验内容和基本原理

    1、实验1.1 顺序表的操作

    利用顺序表存储方式实现下列功能(见参考程序1):

    1)通过键盘输入数据建立一个线性表,并输出该线性表。

    如,依次输入元素25,21,46,90,12,98。

    2)根据屏幕菜单的选择,进行数据的插入、删除和查找,并在插入或删除数据后,再输出线性表。如,在第2个位置上插入元素43,然后输出顺序表。删除顺序表第4个元素,输出改变的顺序表。

    3)在屏幕菜单中选择0,结束程序的运行。

    基本原理:在顺序表的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,在把新元素插入到该位置。当要删除第i个元素时,只需将第i个元素之后的所有元素前移一个位置。

    2、实验1.2 链表的操作 (见参考程序2)

     利用链式存储的方式实现线性表的创建、插入、删除和查找等操作。

    1)请输入初始时链表长度,如输入5。

    如,依次输入元素abcdf,然后输出链表。

    2)删除一个元素,如输入c。

    3)插入一个元素,如输入e。

    4)按关键字查找元素。如输入e。

    5)按序号查找元素。如输入3。

    基本原理:在带头结点的单链表中第i(从1开始计数)个位置之后插入元素、创建带头结点的单链表、在带头结点的单链表中删除第i个位置的元素等,最后输出单链表的内容。

四、实验步骤

    1、顺序表的操作

    1)运行Visual c++6.0,创建一个c++源文件

    提示:选择菜单栏中的“文件”下拉菜单中的“新建”按钮,在弹出的对话框中,选择“文件”子菜单中的“C/C++ Source File”。选中“Add to project”复选框。然后给一个文件名,如“sy1”,并保存在“桌面/姓名学号/”。

    2)将参考程序复制到文档窗口,选择菜单栏中的“组建”下拉菜单中的“编译”选项,在弹出的对话框中选择“是”。

    3)将未完成的代码补充完整,然后选择菜单中的“组建”下拉菜单中的“执行”,或者直接点击工具栏中的“ ”进行连接,调试和运行。

    4)运行程序,并检查插入、删除和查找等操作是否有误,正确后截图到word文档中指定位置。

编制c/c++程序,利用顺序存储方式实现下列功能:从键盘输入数据建立一个线性表(整数,链表,服务器,java ​​​​​​​ ​​​​​ 

图1

    说明:当程序运行错误时,如图2所示,查看组建窗口,双击出错部分(单击窗口然后滑动查看),逐条更改直到程序运行无误。

                    编制c/c++程序,利用顺序存储方式实现下列功能:从键盘输入数据建立一个线性表(整数,链表,服务器,java ​​​​​​​ 

图2

//参考程序1

//* * * * * * * * * * * * * * * * * * * * * * * *

//*PROGRAM          :顺序结构的线性表           *

//*CONTENT          :建立,插入,删除,查找        *

//*编程语言:        Visual c++ 6.0             *

//* * * * * * * * * * * * * * * * * * * * * *



#include<stdio.h>

#include<stdlib.h>

#define MAXSIZE 20

typedef int ElemType;      //数据元素的类型

typedef struct

{

       ElemType a[MAXSIZE];

       int length;

}SqList;                   //顺序存储的结构体类型

SqList a,b,c;

//函数声明

void creat_list(SqList *L);

void out_list(SqList L);

void insert_sq(SqList *L,int i,ElemType e);

ElemType delete_sq(SqList *L,int i);

int locat_sq(SqList L,ElemType e);

//主函数

void main()

{

       int i,k,loc;

       ElemType e,x;

       char ch;

       do {printf("\n\n\n");

       printf("\n          1.建立线性表");

       printf("\n          2.插入元素");

       printf("\n          3.删除元素");

       printf("\n          4.查找元素");

       printf("\n          0.结束程序运行");

       printf("\n          =====================");

       printf("\n          请输入要执行的操作:  ");

       scanf("%d",&k);

       switch(k)

       {

       case 1:{creat_list(&a);

              out_list(a);

                 }

              break;

       case 2:{printf("\n请输入插入位置: ",a.length+1);

              scanf("%d",&i);

              printf("请输入要插入的元素值: ");

              scanf("%d",&e);

              insert_sq(&a,i,e);

              out_list(a);

                 }

              break;

       case 3:{printf("\n请输入要删除元素的位置: ",a.length);

              scanf("%d",&i);

              x=delete_sq(&a,i);

              out_list(a);

              if(x!=-1)

                     printf("\n删除的元素为:%d\n",x);

              else printf("要删除的元素不存在!");

                 }

              break;

       case 4:{printf("\n请输入要查找的元素值:");

              scanf("%d",&e);

              loc=locat_sq(a,e);

              if(loc==-1)

                     printf("\n未找到指定元素!");

              else

                     printf("\n已找到,元素的位置是: %d ",loc);

                 }

              break;

       }/*switch*/

       }

       while(k!=0);

       printf("\n              按回车键,返回...\n");

       ch=getchar();

}/*main*/



//建立线性表

void creat_list(SqList *L)

{

       int i;

       printf("请输入线性表的长度: ");

       scanf("%d",&L->length);

       for(i=0;i<L->length;i++)

       {

              printf("数据 %d =",i);

       scanf("%d",&(L->a[i]));

}

}

//输出线性表

void out_list(SqList L)

{

       int i;

       for(i=0;i<=L.length-1;i++)

              printf("%10d",L.a[i]);

}



//在线性表的第i个位置插入元素e

void insert_sq(SqList *L,int i,ElemType e)

{

       int j;

       if(L->length==MAXSIZE)

              printf("线性表已满!\n");

       else {

              if(i<1||i>L->length+1)

       printf("输入位置错!\n");

              else {

              for(j=L->length-1;j>=i-1;j--)

                     L->a[j+1]=L->a[j];

L->a[i-1]=e; /*将未完成的代码补全,提示:此处添加一条语句,将被删除的元素值赋给e*/

              L->length++;

              }

       }

}



//删除第i个元素,返回其值

ElemType delete_sq(SqList *L,int i)

{

       ElemType x;

       int j;

       if(L->length==0)

              printf("空表!\n");

       else if(i<1||i>L->length)

       {

              printf("输入位置错!\n");

              x=-1;

       }

       else

       {

              x=L->a[i-1];

              for(j=i;j<=L->length-1;j++)

L->a[j-1]=L->a[j]; /*将未完成的代码补全,提示:此处添加一条语句,将被删除元素之后的元素左移。*/          

    L->length--;

       }

       return(x);

}



//查找值为e的元素,返回它的位置

int locat_sq(SqList L,ElemType e)

{

       int i=0;

       while((i<=L.length)&&(L.a[i]!=e) /*将未完成的代码补全,提示:此处添加一条语句*/) i++;

       if(i<=L.length-1)

              return(i+1);

}

    2、链表的操作。

   同顺序表一样。要求读懂程序,然后将未完成的代码补全(红色部分)。

                       文章来源地址https://www.toymoban.com/news/detail-725765.html

//参考程序2

//* * * * * * * * * * * * * * * * * * * * * * * *

//*PROGRAM          :链式结构的线性表           *

//*CONTENT          :生成,插入,删除,定位,查找   *

//*编程语言:        Visual c++ 6.0             *

//* * * * * * * * * * * * * * * * * * * * * *

#include <conio.h>

#include <dos.h>

#include <stdio.h>

#include <stdlib.h>

#define LEN sizeof(LNode)  //定义LEN为一个//节点的长度

enum BOOL{False,True};  //定义BOOL型

typedef struct node

{char data;    //数据域

 struct node *next;//指向下一个节点的指针

}LNode,*LinkList;

void CreatList(LinkList &,int);   //生成一个//单链表

BOOL ListInsert(LinkList &,int,char); //在单//链表中插入一个元素

BOOL ListDelete(LinkList &,int,char &); //在//单链表中删除一个元素

BOOL ListFind_keyword(LinkList,char,int &); //按关键字查找一个元素

BOOL ListFind_order(LinkList,char &,int);  //按序号查找一个元素

void ListPrint(LinkList);      //显示单链表//所有元素

void main()

{LinkList L;

 BOOL temp;

 int num,loc,flag=1;

 char j,ch;



 //---------------------程序解说-----------------------

 printf("本程序实现链式结构的线性表的操作。\n");

 printf("可以进行插入,删除,定位,查找等操作。\n");

 //----------------------------------------------------

 printf("请输入初始时链表长度:"); //输入生成单链表时的元素个数

 scanf("%d",&num);

 CreatList(L,num);      //生成单链表

 ListPrint(L);         

 while(flag)

   { printf("请选择:\n");

     printf("1.显示所有元素\n");  //显示链//表元素

     printf("2.插入一个元素\n");  //插入链//表元素

     printf("3.删除一个元素\n");  //删除链//表元素

     printf("4.按关键字查找元素\n");  //按//关键字查找

      printf("5.按序号查找元素\n"); //按序号//查找

      printf("6.退出程序      \n");  //退出

      scanf(" %c",&j);

      switch(j)

       {case '1':ListPrint(L); break;

        case '2':{printf("请输入元素(一个字符)和要插入的位置:\n");

                 printf("格式:字符,位置;例如:a,3\n");

                 scanf(" %c,%d",&ch,&loc);       //输入要插入的元素和要插入的位置

                 temp=ListInsert(L,loc,ch);      //插入

                 if(temp==False) printf("插入失败!\n"); //插入失败

                 else printf("插入成功!\n"); //成//功插入

                 ListPrint(L);

                 break;

                }

        case '3':printf("请输入要删除的元素所在位置:");

                scanf("%d",&loc);              //输入要删除的节点的位置

       temp=ListDelete(L,loc,ch);    //删除

                if(temp==False) printf("删除失败!\n"); //删除失败

                else printf("成功删除了一个元素:%c\n",ch);   //删除成功,显示该元素

                ListPrint(L);

                break;

        case '4':if(L->next==NULL)                   //链表为空

                   printf("链表为空!\n");

                else{printf("请输入要查找的元素(一个字符):");

                     scanf(" %c",&ch);                //输入要查找的元素

                     temp=ListFind_keyword(L,ch,loc); //按关键字//查找

                     if(temp==False) printf("没有找到该元素!\n"); //查找失败

                     else printf("该元素在链表的第%d个位置。\n",loc);

                                           //成功查找,显示该元素位置

                    }

                break;

        case '5':if(L->next==NULL)                   //链表为空

                   printf("链表为空!\n");

                else{printf("请输入要查找的位置:");

                     scanf("%d",&loc);    //输入//要查找的元素的位置

                     temp=ListFind_order(L,ch,loc); //按序号查找

                     if(temp==False) printf("该位置不存在!\n"); //查找失败

                     else printf("第%d个元素是:%c\n",loc,ch);

                      //成功查找,显示该元素

                    }

                break;

        default:flag=0;printf("程序结束,按任意键退出!\n");

       }

    }

getch();

}

void CreatList(LinkList &v,int n)

{//生成一个带头结点的有n个元素的单链表

 int i;

 LinkList p;

 v=(LinkList)malloc(LEN); //生成头结点

 v->next=NULL;

 printf("请输入%d个字符:例如:abcdefg\n",n);

 getchar();

 for(i=n;i>0;--i)

    {p=(LinkList)malloc(LEN); //生成新结点

     scanf("%c",&p->data);

     p->next=v->next; //将未完成的代码补全,此处添加一条代码

     v->next=p;

    }

}

BOOL ListInsert(LinkList &v,int i,char e)

{//在单链表的第i各位置插入元素e,成功返回//True,失败返回False

 LinkList p,s;

 int j=0;

 p=v;

 while(p&&j<i-1) {p=p->next;++j;} //查找第//i-1个元素的位置

 if(!p||j>i-1) return False;  //没有找到

 s=(LinkList)malloc(LEN);     //生成一个新//结点    

 s->data=e;           

 s->next=p->next; //将未完成的代码补全,此处添加一条代码

   //提示:将新结点插入到单链表中,即修改指针,完成插入操作

 p->next=s;

 return True;

}



BOOL ListDelete(LinkList &v,int i,char &e)

{//在单链表中删除第i个元素,成功删除返回//True,并用e返回该元素值,失败返回False

 LinkList p,q;

 int j=0;

 p=v;

 while(p->next&&j<i-1)  //查找第i-1个元素位//置

    {p=p->next;++j;}

 if(!(p->next)||j>i-1) return False; //查找//失败

 q=p->next;

e=q->data;  /*将未完成的代码补全,此处添加一条代码,提示:删除该元素*/   

 /*将未完成的代码补全,此处添加一条代码,提示:e取得该元素值,即修改指针,删除结点q*/

 free(q);           //释放该元素空间

 return True;

}



BOOL ListFind_keyword(LinkList v,char e,int &i)

{//在单链表中查找关键字为e的元素,成功返回//True,并用i返回该元素位置,

 //失败返回False

 i=1;

 LinkList p;

 p=v->next;

 while((p->data!=e)&&(p->next!=NULL))//p指//针指向下一个,直到

    {p=p->next;  i++;}                        //找到或到链表尾为止

 if(p->data!=e)                      //该元//素在链表中不存在

     return False;

 else return True;

}



BOOL ListFind_order(LinkList v,char &e,int i)

{//在单链表中查找第i个元素,成功返回True,//并用e返回该元素值,

 //失败返回False

 LinkList p;

 int j=0;

 p=v;

 while((p->next!=NULL)&&(j<i) /将未完成的代码补全,此处添加一条代码, 提示:移动指针,直到找到第i个元素*/)

      {p=p->next;++j;}

 if(j!=i) return False; //查找失败

 else {e=p->data;       //查找成功,用e取得//该元素值

       return True;

      }

}

void ListPrint(LinkList v)  

{//显示链表所有元素

 LinkList q;

 q=v->next;

 printf("链表所有元素:");

 while(q!=NULL)

   {printf("%c ",q->data);q=q->next;}

 printf("\n");

}.

到了这里,关于【Dev-c++】C语言数据结构实验——线性表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】线性表的顺序存储结构及实现——C语言版

    线性表的顺序存储结构称为 顺序表 ,其基本思想是 用一段地址连续的存储单元一次存储线性表的数据元素。 设顺序表的每个元素占用 c 个存储单元,则第 i 个元素的存储地址为: 所以, 只要确定了存储顺序表的起始地址(即基地址),计算任意一个元素的存储地址的时间

    2024年03月15日
    浏览(53)
  • C语言数据结构(2)——线性表其一(顺序表)

    欢迎来到博主的新专栏——C语言数据结构 博主ID:代码小豪 再开始这篇文章之前,我们假设要对10个数据进行操作。这十个数据全都被声明成10个变量 如果我们准备为这些数据增加功能,将他们进行赋值,打印,交换等。就会发现一个特别棘手的问题,这些程序写起来太繁杂

    2024年01月19日
    浏览(40)
  • C语言数据结构——线性表之栈和队列

    为什么会定义栈和队列这两种数据结构呢? 原因在于: 之所以会定义栈和队列这样的数据结构 是因为他们有两大特性 : 第一: 他们可以保存程序运行路径中各个点的信息,以便用于回溯操作或其他需要访问已经访问过的节点信息的操作。 比如: 栈用于解决迷宫问题,就

    2023年04月11日
    浏览(112)
  • 南京邮电大学数据结构实验一(线性表的基本运算及多项式的算术运算)(代码篇)

    小伙伴们要多多体会,不要全部借鉴哦!

    2024年02月08日
    浏览(53)
  • 【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)_高高的胖子的博客-CSDN博客  

    2024年02月08日
    浏览(42)
  • 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】六、线性表中的队列(链式结构实现队列)-CSDN博客  ===========================

    2024年02月08日
    浏览(44)
  • 【数据结构初阶】二、 线性表里的顺序表(C语言实现顺序表)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客  =======================================

    2024年02月08日
    浏览(44)
  • 数据结构入门(C语言版)线性表带头双向循环链表接口实现

    在上一篇博客我们讲述了链表的概念和结构,还实现了无头单向非循环链表接口写法,那么这一章节,我们来实现另一种常用的链表组成结构——带头双向循环链表。 如果对前面的链表基本概念还是不了解,可以看作者的上一篇博客: 线性表中链表介绍及无头单向非循环链

    2023年04月12日
    浏览(47)
  • 数据结构入门(C语言版)线性表中顺序表介绍及接口实现

    C语言的学习结束,就该入门数据结构了呦 不论在程序员的工作上,还是在学习或是考研上,数据结构都是一门非常重要且值得我们一直研究探索的学科,可以说数据结构和算法就是编程的核心。OK,接下来我们来到数据结构的入门第一步就是学习线性表,接下来由作者来详细

    2023年04月12日
    浏览(48)
  • 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】四、线性表里的链表(带头+双向+循环 链表 -- C语言实现)_高高的胖子的博客

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包