顺序表:
操作:初始化,插入,删除,查找,取值,输出。
#include<iostream>
#include<cstdio>
#define OK 1
#define error 0
using namespace std;
const int maxsize=1e3+10;
typedef struct
{
int *elem;///存储空间的基地址
int len;
}SeqList;
void menu();
int Init_List(SeqList &L);
int Input_List(SeqList &L);
int Insert_List(SeqList &L,int x,int i);
int Delete_List(SeqList &L,int i);
int Get_elem(SeqList L,int i,int &e);
int Search_elem(SeqList L,int e);
void Output_List(SeqList L);
int main()
{
SeqList List;
menu();
int order=-1,i,x,k,y=0;
while(order){
cout<<"请输入指令:";
cin>>order;
if(order<0||order>7){
cout<<"指令错误,请重新输入!\n\n";
continue;
}
else{
switch(order){
case 1:
if(Init_List(List)){
cout<<"成功建立顺序表\n";
y=1;
}
else
cout<<"顺序表建立失败\n";
puts("");break;
case 2:
cout<<"请输入一组元素序列:";
Input_List(List);
puts("");break;
case 3:
cout<<"请输入需要取值的位置:";
cin>>i;
if(y&&Get_elem(List,i,x))
cout<<"第"<<i<<"个位置的值为:"<<x<<endl;
else
cout<<"取值失败\n";
puts("");break;
case 4:
cout<<"请输入要查找的值:";
cin>>x;
if(!y){
cout<<"查找失败\n\n";
continue;
}
k=Search_elem(List,x);
if(!k)
cout<<"该值不存在\n";
else
cout<<"该值位置为:"<<k<<endl;
puts("");break;
case 5:
cout<<"请输入插入的值:";
cin>>x;
cout<<"请输入插入的位置:";
cin>>i;
if(y&&Insert_List(List,x,i))
cout<<"插入成功\n";
else{
if(!y)cout<<"插入失败,未建立顺序表\n";
else cout<<"插入失败\n";
}
puts("");break;
case 6:
cout<<"请输入所要删除的值的位置:";
cin>>i;
if(y&&Delete_List(List,i))
cout<<"删除成功\n";
else
cout<<"删除失败\n";
puts("");break;
case 7:
if(!y){
cout<<"操作失败,请先建立顺序表\n\n";
continue;
}
Output_List(List);
puts("");break;
}
}
}
if(y) ///已建立顺序表则需释放内存
delete[] List.elem;
cout<<"退出成功\n";
return 0;
}
void menu()
{
cout << "菜单:\n";
cout << "1. 建立\t\t";
cout << "2. 输入\n";
cout << "3. 取值\t\t";
cout << "4. 查找\n";
cout << "5. 插入\t\t";
cout << "6. 删除\n";
cout << "7. 输出\t\t";
cout << "0. 退出\n\n";
}
int Init_List(SeqList &L)///初始化,建立顺序表
{
L.elem=new int[maxsize];
if(!L.elem)exit(-1);
L.len=0;
return OK;
}
int Input_List(SeqList &L)///输入元素
{
if(L.len){
cout<<"输入失败,未建立顺序表\n";
return error;
}
if(L.len==maxsize){
cout<<"输入失败,顺序表存储空间已满\n";
return error;
}
int x;
char ch;
cin>>x;
L.elem[L.len++]=x;
while((ch=getchar())!='\n'){ ///输入一组数直到遇到回车键结束
cin>>x;
L.elem[L.len++]=x;
}
cout<<"输入成功\n";
return OK;
}
int Insert_List(SeqList &L,int x,int i)///插入操作
{
if(i<1||i>L.len+1){
cout<<"插入位置错误,";
return error;
}
if(L.len==maxsize){
cout<<"存储空间已满,";
return error;
}
for(int j=L.len-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=x;
L.len++;
return OK;
}
int Delete_List(SeqList &L,int i)///删除位置i的元素
{
if(i<1||i>L.len)return error;
for(int j=i;j<=L.len-1;j++)
L.elem[j-1]=L.elem[j];
L.len--;
return OK;
}
int Get_elem(SeqList L,int i,int &e)///取值位置i的元素
{
if(i<1||i>L.len)return error;
e=L.elem[i-1];
return OK;
}
int Search_elem(SeqList L,int e)///查找元素e的位置
{
for(int i=0;i<L.len;i++){
if(L.elem[i]==e)
return i+1;
}
return error;
}
void Output_List(SeqList L)///遍历输出顺序表
{
if(!L.len)
cout<<"顺序表为空!\n";
else{
for(int i=0;i<L.len;i++)
cout<<L.elem[i]<<' ';
cout<<endl;
}
}
单链表:
操作:①初始化建立链表 ②输入 ③查找取值 ④插入 ⑤删除 ⑥遍历输出
#include<bits/stdc++.h>
#define ENDL puts("")
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void menu();
void InitList(LinkList &L);
bool Get_elem(LinkList L,int i,int &e);
void InputList(LinkList &L);
void OutputList(LinkList L);
void InsertList(LinkList &L,int e);
//bool InsertList(LinkList &L,int i,int e);
bool DeleteList(LinkList &L,int e);
int main()
{
LinkList List;
int order=-1,i,e,y=0;
menu();
while(order){
cout<<"请输入指令:\n";
cin>>order;
switch(order){
case 1:
InitList(List);
y=1;
cout<<"成功建立单链表\n\n";
break;
case 2:
if(!y){
cout<<"请先建立单链表\n\n";
continue;
}
cout<<"请输入一组元素序列:";
InputList(List);
ENDL;break;
case 3:
cout<<"请输入所要查找的位置:";
cin>>i;
if(y&&Get_elem(List,i,e))
cout<<"第"<<i<<"个位置的值为:"<<e<<endl;
else
cout<<"查找失败\n";
ENDL;break;
case 4:
if(!y){
cout<<"请先建立单链表\n\n";
continue;
}
//cout<<"请输入所要插入值的位置:";cin>>i;
cout<<"请输入所要插入的值:";cin>>e;
/*if(InsertList(List,i,e))
cout<<"插入成功\n";
else
cout<<"插入失败\n";*/
InsertList(List,e);
cout<<"插入成功\n";
ENDL;break;
case 5:
cout<<"请输入所要删除的值:";
cin>>e;
if(y&&DeleteList(List,e))
cout<<"删除成功\n";
else
cout<<"删除失败\n";
ENDL;break;
case 6:
if(!y){
cout<<"未建立单链表\n\n";
continue;
}
OutputList(List);
ENDL;break;
}
}
delete[] List;
cout<<"退出成功\n";
return 0;
}
void menu()
{
cout << "菜单:\n";
cout << "1. 建立单链表\t\t"; cout << "2. 输入数据\n";
cout << "3. 查找操作\t\t"; cout << "4. 插入操作\n";
cout << "5. 删除操作\t\t"; cout << "6. 遍历输出\n";
cout << "0. 退出\n\n";
}
void InitList(LinkList &L)///创建单链表,初始化
{
L=new LNode;
L->next=NULL;
}
bool Get_elem(LinkList L,int i,int &e)///查找位置i的元素
{
LNode *p;
p=L->next;
int j=1;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i)return false;
e=p->data;
return true;
}
/*
void InputList(LinkList &L) ///输入
{
char ch;
LNode *p,*r;
p=new LNode;
r=L;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
while((ch=getchar())!='\n'){
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}*/
void InputList(LinkList &L)///排序后输入
{
char ch;
int num[1000],o=0;
cin>>num[o++];
while((ch=getchar())!='\n') //输入一组数直到按回车键结束输入
cin>>num[o++];
sort(num,num+o);
LNode *p,*r;
L->next=NULL;
r=L;
for(int i=0;i<o;i++){
p=new LNode;
p->data=num[i];
p->next=NULL;
r->next=p;
r=p;
}
}
void OutputList(LinkList L) ///遍历输出
{
while(L->next!=NULL){
cout<<L->next->data<<' ';
L=L->next;
}
cout<<'\n';
}
/*
bool InsertList(LinkList &L,int i,int e) ///向位置i插入元素e
{
LNode *p;
p=L;
int j=0;
while(p&&(j<i-1)){
p=p->next;
j++;
}
if(!p||j>i-1)return false;
LNode *s;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
*/
void InsertList(LinkList &L,int e)///从小到大有序插入元素e
{
LNode *p,*s;
p=L;
while(p->next){
if(p->next->data>e)
break;
p=p->next;
}
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
}
bool DeleteList(LinkList &L,int e) ///删除元素e
{
LNode *p,*q;
p=L;
int j=0;
while(p->next){
if(p->next->data==e)
break;
p=p->next;
}
if(!(p->next))return false;
q=p->next;
p->next=q->next;
return true;
}
本文详细介绍了顺序表和单链表的基本操作,包括初始化、输入、查找、插入、删除和输出等,通过具体代码实现展示了数据结构在实际应用中的操作流程。

221

被折叠的 条评论
为什么被折叠?



