链表的建立、查找、插入、删除

链表定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表c++代码:

#include<bits/stdc++.h>
using namespace std;
int i,j;
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LinkNode;
///头插法
void creativeList(LinkNode *&L,ElemType a[],int n)
{
    LinkNode*s;
    L=(LinkNode*)malloc(sizeof(LinkNode));
    L->next=NULL;
    for(i=0; i<n; i++)
    {
        s=(LinkNode*)malloc(sizeof(LinkNode));
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
    printf("链表(头插法)创建成功\n");
}
///尾插法
void CreatListR(LinkNode*&L,ElemType a[],int n)
{
    LinkNode*s,*r;
    L=(LinkNode*)malloc(sizeof(LinkNode));
    r=L;
    for(int i=0; i<n; i++)
    {
        s=(LinkNode*)malloc(sizeof(LinkNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
    printf("链表(尾插法)创建成功\n");
}
///初始化线性表
void initList(LinkNode*&L)//初始化
{
    L=(LinkNode*)malloc(sizeof(LinkNode));
    L->next=NULL;
}
///销毁线性表
void destoryList(LinkNode*&L)//销毁
{
    LinkNode *before=L,*after=L->next;
    while(after!=NULL)
    {
        free(before);
        before=after;
        after=before->next;
    }
    free(before);
}
int ListLength(LinkNode *&L)//取长度(不包含头节点)
{
    int n=0;
    LinkNode *p=L;
    while(p->next!=NULL)
    {
        n++;
        p = p->next;
    }
    return n;
}
///按元素值查找
int  LocateElem(LinkNode*L,ElemType e)//查找值为e的元素
{
    int i=1;
    LinkNode *p=L->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
        return (0);
    else
        return (i);
}
///插入数据元素
bool TAKEinElem(LinkNode*&L,int i,ElemType e)//增
{
    int j=0;
    LinkNode *p=L,*s;
    if(i<=0)
        return false;
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
    {
        return false;
    }
    else
    {
        s=(LinkNode*)malloc(sizeof(LinkNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
    cout<<"插入成功:"<<endl;
        return true;
    }
}
bool DeleteElem(LinkNode*&L,int i,ElemType&e)//删
{
    int j=0;
    LinkNode*p=L,*q;
    if(i<=0)
        return false;
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
    {
        return false;
    }
    else
    {
        q=p->next;
        if(q==NULL)
            return false;
        e=q->data;
        p->next=q->next;
        free(q);
        cout<<"删除成功:"<<endl;
        return true;
    }
}
void DispList(LinkNode*L)//输出
{
    LinkNode*p=L->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
bool GetElem(LinkNode *L, int i, ElemType &e)//求线性表中某个数据元素值
{
    int j = 0;
    LinkNode *p = L;
    if (i <= 0)
    {
        return false;
    }
    while (j < i&&p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
    {
        return false;
    }
    else
    {
        e = p->data;
        return true;
    }
}
int main()
{
    int n,k,t,m,x,v,s=1;
    cout<<"输入n,然后输入n个元素"<<endl;
    LinkNode*L;
    ElemType a[100];
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>a[i];
    }
    initList(L);
    cout<<"1.头插法  2.尾插法"<<endl;
    while(s)
    {
            s--;
        cin>>v;
        switch(v)
        {
        case 1:
        {
            creativeList(L,a,n);
            DispList(L);
        break;
        }
        case 2:
        {
            CreatListR(L,a,n);
            DispList(L);
            break;
        }
        default:
            printf("输入错误!!!\n");
            s++;
        }
    }
    //creativeList(L,a,n);
    //DispList(L);
    //CreatListR(L,a,n);
    //DispList(L);
    cout<<"在第k个元素插入t"<<endl;
    cin>>k>>t;
    TAKEinElem(L,k,t);
    DispList(L);
    cout<<"删除第m个元素"<<endl;
    cin>>m;
    DeleteElem(L,m,x);
    DispList(L);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值