【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文档中指定位置。

​​​​​​​ ​​​​​ 

图1

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

                     ​​​​​​​ 

图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、链表的操作。

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

                       

//参考程序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");

}.

  • 15
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Karry D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值