实验一:顺序表、单链表

本文详细介绍了顺序表和单链表的基本操作,包括初始化、输入、查找、插入、删除和输出等,通过具体代码实现展示了数据结构在实际应用中的操作流程。

顺序表:

操作:初始化,插入,删除,查找,取值,输出。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值