实验二 单链表的操作

实验性质:设计性实验

要求

(1)编程实现单链表的以下基本操作:建立单链表,查找单链表,插入单链表,删除单链表。
(2)采用单链表结构编程实现:两个有序单链表的归并运算。

目的:

(1)掌握线性表的链式存储结构;
(2)掌握单链表及其基本操作的实现。

代码

#include <iostream>

using namespace std;
typedef int ElemType;

//定义结点存储结构
typedef struct LNode
{
    ElemType data;  //数据域
    struct LNode *next;  //指针域
}LNode,*LinkList;

void InitList(LinkList &L); //单链表的初始化
void InsertList(LinkList &L,int i,int x,bool y);//单链表的插入
void DeleteList(LinkList &L,int i); //删除指定位置的元素
void Display(LinkList &L); //显示单链表
void LocateElem(LinkList &L,int x);   //查找
void CreateTwoList(LinkList &LA,LinkList &LB);  //生成两个单链表
void MergeList(LinkList &LA,LinkList &LB,LinkList &LC);   //合并有序单链表
void Menu();  //文字菜单提示信息

int main()
{
    LinkList L;LinkList LA;LinkList LB;LinkList LC;
    Menu();
    InitList(L);
    int h,k;    //获取输入的指定位置和插入数据的元素
    int i;  //输入的数字
    cout<<"请输入操作代码:";
    cin>>i;
    while(true)
    {
        switch(i)
        {
        case 1:
            cout<<"输入要操作的位置:";
            cin>>h;
            cout<<"输入要插入的值:";
            cin>>k;
            InsertList(L,h,k,true);
            break;
        case 2:
            cout<<"输入要操作的位置:";
            cin>>h;
            DeleteList(L,h);
            break;
        case 3:
            Display(L);
            break;
        case 4:
            cout<<"输入要操作的值:";
            cin>>k;
            LocateElem(L,k);
            break;
        case 5:
            CreateTwoList(LA,LB);
            break;
        case 6:
            MergeList(LA,LB,LC);
            break;
        default:
            if(i<0)
                return 0;
            else
            {
                cout<<"输入的位置非法,请重新输入";
                break;
            }
        }
        cout<<"请输入操作代码:";
        cin>>i;
    }
    return 0;
}
void InitList(LinkList &L)//初始化
{
    L=new LNode;
    L->next=NULL;
}
void InsertList(LinkList &L,int i,int x,bool y)//插入单链表
{
    LNode *p=L; int j=0;
    while(p && (j<i-1))
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        cout<<"输入的位置非法"<<endl;
    else
    {
        LNode *s;
        s=new LNode;
        s->data=x;
        s->next=p->next;
        p->next=s;
        if(y)
            cout<<"插入元素成功"<<endl;
    }
}
void DeleteList(LinkList &L,int i)//删除指定元素
{
    LNode *p=L;int j=0;
    while((p->next) && (j<i-1))
    {
        p=p->next;
        ++j;
    }
    if(!(p->next)||(j>i-1))
        cout<<"输入的位置非法"<<endl;
    else
    {
        LNode *q=p->next;
        p->next=q->next;
        delete q;
        cout<<"元素删除成功"<<endl;
    }
}
void Display(LinkList &L)//显示单链表
{
    LNode *p=L->next;
    if(!p)
    {
        cout<<"当前单链表为空"<<endl;
        return;
    }
    cout<<"单链表元素为:";
    while(p)
    {
        if(p->next)
            cout<<p->data<<",";
        else
            cout<<p->data<<endl;
        p=p->next;
    }
}
void LocateElem(LinkList &L,int x)
{
    LNode *p=L->next;
    while(p && p->data!=x)
        p=p->next;
    if(p)
        cout<<"成功找到元素"<<endl;
    else
        cout<<"元素不存在"<<endl;
}
void CreateTwoList(LinkList &LA,LinkList &LB)
{
    InitList(LA);
    InitList(LB);
    InsertList(LA,1,2,false);InsertList(LA,2,4,false);InsertList(LA,3,5,false);
    InsertList(LB,1,3,false);InsertList(LB,2,5,false);InsertList(LB,3,7,false);
    cout<<"成功创建两个单链表"<<endl;
    cout<<"LA为";Display(LA);
    cout<<"LB为";Display(LB);
}
void MergeList(LinkList &LA,LinkList &LB,LinkList &LC)
{
    LNode *pa=LA->next;LNode *pb=LB->next;
    LC=LA;
    LNode *pc=LC;
    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else
        {
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;
    delete LB;
    cout<<"合并成功,LC";
    Display(LC);
}

void Menu()
{
    cout << "1-----在单链表指定位置插入元素 "<< endl;
    cout << "2-----删除单链表指定位置元素" << endl;
    cout << "3-----显示单链表" << endl;
    cout << "4-----查找元素" << endl;
    cout << "5-----自动创建两个单链表" << endl;
    cout << "6-----合并两个单链表" << endl;
    cout << "   退出,输入一个负数!" << endl;
}

写在最后

本文章仅供个人复习使用,如有错误,请联系我更正。

发布了21 篇原创文章 · 获赞 34 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zss192/article/details/105204738