概述
实验一 顺序表、单链表基本操作的实现
实验目的
1、顺序表
(1)掌握顺序表的存储结构形式及其描述
(2)掌握顺序表的建立、查找、插入、删除操作
2、链表
(1)掌握单链表的存储结构形式及其描述
(2)掌握单链表的建立、查找、插入和删除操作
实验内容
1、顺序表
- 编写函数,输入一组整型元素序列,建立一个顺序表。
- 编写函数,实现对该顺序表的遍历(每个元素被访问一次且仅被访问一次)。
- 编写函数,在顺序表中顺序查找某一元素,查找成功则返回其存储位置i,否则返回错误信息。
- 编写函数,实现在顺序表的第i个位置上插入一个元素x。
- 编写函数,实现删除顺序表中第i个元素。
- 编写一个主函数,在主函数中设计一个简单的菜单,分别调用上述函数。
2、链表 - 编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)。
- 编写函数,实现遍历单链表。
- 编写函数,在非递减有序单链表中插入一个元素使链表仍然有序。
- 编写函数,实现在非递减有序链表中删除值为x的结点。
- 编写一个主函数,在主函数中设计一个简单的菜单,分别调用上述函数。
顺序表
#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;
}
最后
以上就是高兴哈密瓜为你收集整理的实验一 顺序表、单链表基本操作的实现的全部内容,希望文章能够帮你解决实验一 顺序表、单链表基本操作的实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复