链表建立,插入,查找,删除,归并

#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;

int len;
struct Node
{
    int data;
    Node *next;
};

Node *CreateList()//创建
{
    Node *pHead=(Node *)malloc(sizeof(Node));
    return pHead;
}

void InitList(Node *pHead)//初始化
{
    int data;
    cout<<"输入链表长度:";
    cin>>len;
    Node *p,*q;
    q=pHead;
    for(int i=0; i<len; i++)
    {
        cin>>data;
        p=(Node *)malloc(sizeof(Node));
        p->data=data;
        p->next=NULL;
        q->next=p;
        q=q->next;
    }
}

void ReadList(Node *pHead)//遍历
{
    Node *temp=pHead->next;
    while(1)
    {
        cout<<temp->data<<" ";
        temp=temp->next;
        if(temp==NULL)break;
    }
    cout<<endl;
}

void ListInsert(Node *pHead,int location,int data)//插入
{
    Node *p,*q;
    p=pHead;
    if(location<0||location>len)
    {
        cout<<"位置错误"<<endl;
        return;
    }
    for(int i=0; i<location; i++)//寻找位置
    {
        p=p->next;
    }
    q=p->next;
    p->next=(Node *)malloc(sizeof(Node));
    p->next->data=data;
    p->next->next=q;
}

void ListSearch(Node *List,int location)//查找
{
    if(location<1||location>len)
    {
        cout<<"位置有误"<<endl;
        return;
    }

    for(int i=1; i<=location; i++)
    {
        List=List->next;
    }
    cout<<"找到"<<List->data<<endl;
}

void ListDelete(Node *List,int location)//删除元素
{
    if(location<1||location>len)
    {
        cout<<"位置有误"<<endl;
        return;
    }

    for(int i=1; i<location; i++)
    {
        List=List->next;
    }
    cout<<"删除了"<<List->next->data<<endl;
    Node *p=List->next;
    List->next=List->next->next;
    free(p);
}

void Destroy(Node *List)//销毁
{
    Node *p=List->next->next;
    Node *q=List->next;
    while(1)
    {
        free(q);
        q=p;
        p=p->next;
        if(p==NULL)
        {
            break;
        }
    }
    free(q);
    len=0;
    cout<<"已销毁"<<endl;
}

void ListUnit(Node *Lista,Node *Listb,Node **Result)//归并
{
    Node *r,*k;
    if(Lista->next->data<=Listb->next->data)//准备删除较大的头节点,Result保留小的头节点作为结果链表的头节点
    {
        r=Listb;
        k=Lista;
    }
    else
    {
        r=Lista;
        k=Listb;
    }
    *Result=k;
    Node *p=Lista->next,*q=Listb->next;

    while(p&&q)
        if(p->data<=q->data)
        {
            k->next=p;
            k=k->next;
            p=p->next;
        }
        else
        {
            k->next=q;
            k=k->next;
            q=q->next;
        }
    while(p)//插入p剩余的元素
    {
        k->next=p;
        k=k->next;
        p=p->next;
    }
    while(q)//插入q剩余的元素
    {
        k->next=q;
        k=k->next;
        q=q->next;
    }
    free(r);//删除多余的头节点
}

int main()
{
    len=0;
    Node *header=CreateList();
    InitList(header);
    int n;
    cout<<"输入要查找的位置:";
    cin>>n;
    int e;
    ListSearch(header,n);

    cout<<"输入要插入的位置:";
    cin>>n;
    cin>>e;
    ListInsert(header,n-1,e);
    ReadList(header);

    cout<<"输入要删除的位置:";
    cin>>n;
    ListDelete(header,n);

    ReadList(header);

    Destroy(header);

    /*
    Node *la=CreateList(),*lb=CreateList();
    InitList(la);
    ReadList(la);
    InitList(lb);
    ReadList(lb);
    Node *result;
    ListUnit(la,lb,&result);
    ReadList(result);*/
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值