ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单链表的实现

2022-04-03 00:02:29  阅读:142  来源: 互联网

标签:单链 lnode 实现 next linklist int while cout


包括:创建,遍历,查找,删除,插入,两个有序链表的合并

#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR -1
#define OVERFLOW -1
typedef struct lnode
{
    int data;
    struct lnode *next;
}lnode,*linklist;
//后插法 
void Getlist(linklist &L)
{
    L=new lnode;
    L->next=NULL;
    linklist r=L;
    int n;
    cout<<"请输入数据(-1为结束标志):";
    cin>>n;
    while(n!=-1)
    {
    linklist p=new lnode;
    p->data=n;
    p->next=NULL;
    r->next=p;
    r=p;
    cin>>n;
    }
}
//遍历
int travellist(linklist &L)
{
    linklist p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    cout<<endl;    
} 
//查找 
int Locatedlist(linklist &L,int e)
{
    linklist p;
    p=L->next;
    int count=0;
    while(p!=NULL)
    {
        count++;
        if(p->data==e)
        return count;
        p=p->next;
    }
    return ERROR;
}
//查找,返回地址
//加星号表示返回地址,返回的地址类型需要与子函数的类型相同 
//lnode *locatedlist(linklist &L,int e)
//{
//    linklist p;
//    p=L->next;
//    while(p&&p->data!=e)
//    {
//        p=p->next;
//    }
//    return p;
// } 
//插入 
int Insertlist(linklist &L,int i)
{
    int e;
    cout<<"请输入要插入的数据:";
    cin>>e; 
    linklist p=L;
    int j=0;
    //找到i-1的位置,即j=i-1
    while(p&&j<i-1) 
    {
        p=p->next;
        j++;
    }
    //如果j<1或j>i-1,ERROR 
    if(!p||j>i-1)
    return ERROR;
    linklist s=new lnode;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
//删除 
int Datalist(linklist &L,int i)
{
    int e;
    linklist p=L;
    int j=0;
    while((p->next)&&(j<i-1))
    {
        p=p->next;j++;
    }
    //i>n或i<1,ERROR 
    //实际上是把指针放到了i-1的位置上,要删除i,所以p->next不为空 
    if(!(p->next)||j>i-1) return ERROR;
    linklist s;
    s=p->next;
    p->next=s->next;
    e=s->data;
    delete s;
    return OK;
}
//合并,L1,L2都为升序排序 
void Mergelist(linklist &L1,linklist &L2)
{
    int e;
    L1=new lnode;
    L1->next=NULL;
    linklist r1=L1;
    cout<<"请输入L1链表的数据(-1)结束:";
    cin>>e;
    while(e!=-1)
    {
        linklist p1=new lnode;
        p1->next=NULL;
        p1->data=e;
        r1->next=p1;
        r1=p1;
        cin>>e;
    }
    travellist(L1);
    L2=new lnode;
    L2->next=NULL;
    linklist r2=L2;
    cout<<"请输入L2链表的数据(-1)结束:";
    cin>>e;
    while(e!=-1)
    {
        linklist p2=new lnode;
        p2->next=NULL;
        p2->data=e;
        r2->next=p2;
        r2=p2;
        cin>>e;
    }
    travellist(L2);
    linklist pa=L1->next;
    linklist pb=L2->next;
    linklist pc=L1;
    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 L2;
    cout<<"合并后的数据为:";
    travellist(L1);
 } 
//主函数 
int main()
{ 
    char n;    
    cout<<"1.创建链表"<<endl;
    cout<<"2.查找数据"<<endl; 
    cout<<"3.删除第i个数据"<<endl;
    cout<<"4.在第i个元素的位置插入数据"<<endl;
    cout<<"5.将L1和L2合并"<<endl;
    cout<<"按0结束操作"<<endl;
    cin>>n;
    while(n!='0')
    {
    int a,b,c;
    switch(n)
    {
        case '1':
            linklist l;
            Getlist(l);
            travellist(l);
            break;
        case '2':
            cout<<"请输入要查找的元素:";
            cin>>a;
            cout<<"数据的位置为:";
            cout<<Locatedlist(l,a)<<endl;
            break;
        case '3':
            cout<<"请输入要删除的数据位置:";
            cin>>a;
            Datalist(l,a);
            travellist(l);
            break;
        case '4':
            cout<<"请输入要插入数据的位置:";
            cin>>a;
            cout<<endl;
            Insertlist(l,a);
            travellist(l);
            break;
        case '5':
            linklist l1,l2;
            Mergelist(l1,l2);
            break;
        default: cout<<"无效输入"<<endl;break; 
    }
    cout<<"请选择下一个操作:"<<endl;
    cout<<"1.创建链表"<<endl;
    cout<<"2.查找数据"<<endl; 
    cout<<"3.删除第i个数据"<<endl;
    cout<<"4.在第i个元素的位置插入数据"<<endl;
    cout<<"5.将L1和L2合并"<<endl;
    cout<<"按0结束操作"<<endl;
    cin>>n;
    }
}

1.创建:

 

 2.查找:

 

 3.删除

 

 4.插入:

 

 5.合并:

 

标签:单链,lnode,实现,next,linklist,int,while,cout
来源: https://www.cnblogs.com/inawaken/p/16094879.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有