单链表的基本操作(c++实现)

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

/*
(1)
*/
#include <iostream>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

bool InitList(LinkList &L);
void CreateList(LinkList &L,int n);
void PrintList(LinkList L);
void FoundList(LinkList L,int e);
void InsertList(LinkList &L,int i,int e);
void DeleteList(LinkList &L,int i);

using namespace std;
int main(){
    int n,e,insertn,inserte,deleten;
    LinkList L;
    InitList(L);
    cout<<"请输入单链表长度:";
    cin>>n;
    CreateList(L,n);
    PrintList(L);
    cout<<"请输入要查找的值:";
    cin>>e;
    FoundList(L,e);
    cout<<"请输入要插入的位置:";
    cin>>insertn;
    cout<<"请输入要插入的值:";
    cin>>inserte;
    InsertList(L,insertn,inserte);
    cout<<"请输入要删除的位置:";
    cin>>deleten;
    DeleteList(L,deleten);

    return 0;
}
//初始化单链表
bool InitList(LinkList &L){
    L=new LNode;
    L->next=NULL;
    return true;
}
//建立单链表(后插法)
void CreateList(LinkList &L,int n){
    LinkList r,p;
    L=new LNode;
    L->next=NULL;
    r=L;
    cout<<"请输入单链表:";
    for(int i=0;i<n;i++){
        p=new LNode;
        cin>>p->data;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
//打印单链表
void PrintList(LinkList L){
    LinkList p;
    p=L->next;
    cout<<"单链表为:";
    while(p){
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
//查找单链表
void FoundList(LinkList L,int e){
    LinkList p;
    p=L->next;
    int counts=0;
    while(p){
        if(p->data==e){
           counts++;
            cout<<"第"<<counts<<"次找到了与"<<e<<"相等的值"<<endl;
        }
        p=p->next;
    }
    if(counts==0){
        cout<<"没有找到与"<<e<<"相等的值"<<endl;
    }
}
//插入单链表,在第i个位置插入值为e的结点
void InsertList(LinkList &L,int i,int e){
    LinkList p,s;
    p=L;
    int counts=0;
    while(p&&(counts<i-1)){
        p=p->next;
        counts++;
    }
    s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s;
    PrintList(L);
}
//删除单链表,删除第i个位置的结点
void DeleteList(LinkList &L,int i){
    LinkList s;
    LinkList p=L;
    int counts=0;
    while(p&&(counts<i-1)){
        p=p->next;
        counts++;
    }
    s=p->next;
    p->next=s->next;
    delete s;
    PrintList(L);
}
/*
(2)
*/
#include <iostream>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

bool InitList(LinkList &L);
void CreateList(LinkList &L,int n);
void PrintList(LinkList L);
LinkList MergeList(LinkList A,LinkList B,LinkList &C);

using namespace std;
int main(){
    int na,nb;
    LinkList A;
    InitList(A);
    cout<<"请输入单链表长度:";
    cin>>na;
    CreateList(A,na);
    PrintList(A);
    LinkList B;
    InitList(B);
    cout<<"请输入单链表长度:";
    cin>>nb;
    CreateList(B,nb);
    PrintList(B);
    LinkList C;
    InitList(C);
    C=MergeList(A,B,C);
    PrintList(C);

    return 0;
}
//两个有序单链表的归并
LinkList MergeList(LinkList A,LinkList B,LinkList &C){
    LinkList a,b,c;
    a=A->next;
    b=B->next;
    C=A;
    c=C;
    while(a&&b){
        if(a->data<=b->data){
            c->next=a;
            c=a;
            a=a->next;
        }else{
            c->next=b;
            c=b;
            b=b->next;
        }
    }
    c->next=a?a:b;
    delete B;
    return C;
}
//建立有序单链表(后插法)
void CreateList(LinkList &L,int n){
    LinkList r,p;
    L=new LNode;
    L->next=NULL;
    r=L;
    cout<<"请输入单链表:";
    for(int i=0;i<n;i++){
        p=new LNode;
        cin>>p->data;
        p->next=NULL;
        r->next=p;
        r=p;
    }
    LinkList a,b;
    int temp;
    for(a=L->next;a!=NULL;a=a->next){
        for(b=a->next;b!=NULL;b=b->next){
            if(a->data>b->data){
                temp=a->data;
                a->data=b->data;
                b->data=temp;
            }
        }
    }
}
//初始化单链表
bool InitList(LinkList &L){
    L=new LNode;
    L->next=NULL;
    return true;
}
//打印单链表
void PrintList(LinkList L){
    LinkList p;
    p=L->next;
    cout<<"单链表为:";
    while(p){
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
  • 14
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值