我是靠谱客的博主 高兴哈密瓜,最近开发中收集的这篇文章主要介绍实验一 顺序表、单链表基本操作的实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

实验一 顺序表、单链表基本操作的实现

实验目的
1、顺序表
(1)掌握顺序表的存储结构形式及其描述
(2)掌握顺序表的建立、查找、插入、删除操作
2、链表
(1)掌握单链表的存储结构形式及其描述
(2)掌握单链表的建立、查找、插入和删除操作
实验内容
1、顺序表

  1. 编写函数,输入一组整型元素序列,建立一个顺序表。
  2. 编写函数,实现对该顺序表的遍历(每个元素被访问一次且仅被访问一次)。
  3. 编写函数,在顺序表中顺序查找某一元素,查找成功则返回其存储位置i,否则返回错误信息。
  4. 编写函数,实现在顺序表的第i个位置上插入一个元素x。
  5. 编写函数,实现删除顺序表中第i个元素。
  6. 编写一个主函数,在主函数中设计一个简单的菜单,分别调用上述函数。
    2、链表
  7. 编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)。
  8. 编写函数,实现遍历单链表。
  9. 编写函数,在非递减有序单链表中插入一个元素使链表仍然有序。
  10. 编写函数,实现在非递减有序链表中删除值为x的结点。
  11. 编写一个主函数,在主函数中设计一个简单的菜单,分别调用上述函数。

顺序表

#include<iostream>
#include<fstream>
using namespace std;
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100 
#define ERROR 0 
//定义顺序表
typedef struct
{
int *elem;
int Length;
}SqList;
//创建顺序表
int InitiList(SqList &L)
{//构造一个空的顺序表L
L.elem=new int[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem)
{
printf("空间分配失败!");
}
L.Length=0;
return 1;
}
//依次输入顺序表元素
void inputSqList(SqList &L,int y)
{
int i,x;
printf("请依次输入顺序表:");
for(i=0;i<y;i++)
{
scanf("%d",&x);
L.elem[i]=x;
}
L.Length=y;
}
//实现对该顺序表的遍历
void outputSqList(SqList &L)
{
int i;
printf("[t");
for(i=0;i<L.Length;i++)
{
printf("%dt",L.elem[i]);
}
printf("]");
}
int Insert_SqList(SqList &L,int i,int x)
/*插入运算函数*/
{
//判断插入的位置是否合理
if(i<0||i>L.Length+1){
printf("插入的位置不合理!");
return 0;
}
//判断存储空间是否已满
if(L.Length==MAXSIZE){
printf("存储空间已满!");
return 0;
}
//在顺序表的第i个位置上插入一个元素x
for(int j=L.Length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];//插入之后的元素后移
L.elem[i-1]=x;//将新元素x放入第i个位置
++L.Length;//表长加1
return 1;
}
int Delete_SqList(SqList &L,int i)
/*删除运算函数*/
{
if(i<0||(i>L.Length+1))
{
printf("删除的位置不合理!");
return 0;
}//i值不合理
for(int j;j<=L.Length-1;j++)//被删除之后的元素前移
{
L.elem[j-1]=L.elem[j];
}
--L.Length;//表长减一
return 1;
}
//按值查找:在顺序表查找某一元素,若查找成功的返回其存储位置i,否则返回错误信息
int Location_SqList(SqList &L,int x)
/*按值查找函数*/
{
int flag=1;
if(flag){
for(int i=0;i<L.Length;i++){
if(L.elem[i]==x)
printf("第%d个位置",i+1);
}
flag=0;//遍历一遍后退出循环
}
else
printf("元素查找失败!n");
}
int main()
{
SqList L;//定义顺序表
int n,flag=1;//n为输入的选择选项
while(flag)
{
printf("tt1.initializationnn");
printf("tt2.insertnn");
printf("tt3.deletenn");
printf("tt4.locationnn");
printf("tt5.exitnn");
printf("nnntplease select:");
scanf("%d",&n);
if(n<=0||n>=6)//判断输入的选择是否正确
{
printf("选择的选项不存在!n") ;
}
else{
//根据n查找对应的功能
switch(n)
{
case 1:
int y;//y为顺序表的长度
InitiList( L);//创建顺序表
printf("n请输入顺序表的长度:");
scanf("%d",&y);
inputSqList(L,y);//依次输入顺序表元素
printf("遍历输出顺序表:");
outputSqList(L);
printf("nn");
break;
case 2://2.insert
int i1,x1,success1;//i1为插入的位置,x1为插入的数,success1为调用函数后返回的值
printf("请输入要插入的位置:");
scanf("%d",&i1);
printf("请输入要插入的数:");
scanf("%d",&x1);
success1=Insert_SqList(L,i1,x1);
if(success1==1)
{
printf("插入后的顺序表为:");
outputSqList(L);
}
printf("nn");
break;
case 3:
int i2,success2;
printf("请输入要删除的位置:n");
scanf("%d",&i2);
success2=Delete_SqList(L,i2);
if(success2==1)
{
printf("删除后的顺序表为:");
outputSqList(L);
}
printf("nn");
break;
case 4:
int x2;
printf("请输入要查找的元素:n");
scanf("%d",&x2);
printf("该元素的位置为:");
Location_SqList(L,x2);
printf("nn");
break;
case 5:
flag=0;//退出整个选择循环
}
}
}
return 0;
}

单链表

#include<iostream>
#include<fstream>
using namespace std;
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100 
#define ERROR 0
#define OK 1
//定义链表
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//单链表的初始化
int
InitList(LinkList &L)
{
//构造一个空的单链表l
L=new LNode;//生成新结点作为头结点,用头指针L指向头结点
L->next=NULL;//头结点的指针域置空
return 1;
}
//获取单链表长度 头结点无数据,不算
int ListLength(LinkList L)
{
LinkList p=L;int sum=0;
while(p)
{
sum++;
p=p->next;
}
return sum-1;//去除头结点
}
//初始化头插法
void GreateList_H(LinkList &L,int n)
{
//逆位序输n个元素的值,建立带表头结点的单链表L
L=new LNode;
L->next=NULL;//先建立一个带头结点的空链表
LinkList p=L;
printf("请依次输入单链表:");
for(int i=0;i<n;++i)
{
p=new LNode;
cin>>p->data;//输入元素值赋给新结点*p的数据域
p->next=L->next;
L->next=p;
}
}
//遍历输出函数
void PrintList(LinkList L)
{
LinkList p=L->next;//跳过头结点
if(ListLength(L))
{
printf("当前单链表所有元素:");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("n");
}
else
{
printf("当前单链表已空!n");
}
}
//插入
int ListInsert(LinkList &L,int i,int e)
{
//在带头结点的的单链表L中第i个位置插入值为e的新结点
LinkList p=L;
int j=0;
LNode* s;
while(p&&(j<i-1))
{
p=p->next;++j;//查找第i-1个结点,p指向该结点
}
if(!p||j>i-1)
{
printf("插入位置无效!!!n");
return 0;
}
s=new LNode;//生成新结点*s
s->data=e;//将新结点的数据域置为e
s->next=p->next;//将结点*s的指针域指向结点ai
p->next=s;//将结点*p的指针域指向结点*s
return 1;
}
int ListDelete(LinkList &L,int i)
{
//在带头结点的单链表L中,删除第i个元素
LinkList p=L;int j=0;LNode* q;
while((p->next)&&(j<i-1))
{
p=p->next;++j;//查找第i-1个结点,p指向该结点
}
if(!(p->next)||(j>i-1))
{
printf("删除位置无效!!!n");
return 0;
}//当i>n或i<1,删除位置不合理
q=p->next;//临时保存被删结点的地址以备释放
p->next=q->next;//改变删除结点前驱
delete q;//释放删除结点的空间
return 1;
}
//主函数
int main()
{
LinkList L;int choice;
InitList(L);
while(1)
{
printf("tt1.输入nn");
printf("tt2.插入nn");
printf("tt3.删除nn");
printf("tt4.输出nn");
printf("tt5.退出nn");
printf("nnnt请输入菜单序号:");
scanf("%d",&choice);
if(choice==5) break;
switch(choice)
{
case 1:
int y;//y单链表的长度
InitList(L);//创建单链表表
printf("n请输入单链表的长度:");
scanf("%d",&y);
GreateList_H(L,y);//依次输入单链表元素
printf("遍历输出单链表:");
PrintList(L);
printf("nn");
break;
case 2:
int place;int e;bool flag;
printf("请输入要插入的位置(从1开始)及元素:n");
scanf("%d%d",&place,&e);
flag=ListInsert(L,place,e);
if(flag)
{
printf("插入成功!!!n");
PrintList(L);
}break;
case 3:
int p;int s;
printf("请输入要删除的位置(从1开始):n");
scanf("%d",&place);
s=ListDelete(L,place);
if(s)
{
printf("删除成功!!!n");
PrintList(L);
}break;
case 4:PrintList(L);break;
default:printf("输入错误!!!n");
}
}
return 0;
}

最后

以上就是高兴哈密瓜为你收集整理的实验一 顺序表、单链表基本操作的实现的全部内容,希望文章能够帮你解决实验一 顺序表、单链表基本操作的实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部