链表操作

编程实现单链表的以下基本操作:建立单链表,查找单链表,插入单链表,删除单链表。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW

using namespace std;

typedef int ElemType;
typedef int Status;
//创建结构体,LNode是类型名,LinkList是LNode的指针类型的类型名
typedef struct LNode{
   ElemType data;
   struct LNode *next;
}LNode,*LinkList;

void CreatList_L(LinkList &L,int n)
{//申请一块类型为LNode的空间,地址赋值给L,初始作为头结点(没有存储数据,负责指向第一个节点 )
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    LinkList p;
    for(int i=n;i>0;i--)
    {
        p=(LinkList)malloc(sizeof(LNode));
        cin>>p->data;
        p->next=L->next;
        L->next=p;
    }
}

Status ListInsert_L(LinkList &L,int i,ElemType e)
{
    LinkList p;
    p=L;
    int j;
    j=0;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1)
        return ERROR;
    LinkList s;
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}

Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
    LinkList p,q;
    p=L;
    int j;
    j=0;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1)
        return ERROR;
    q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
    return OK;

}

Status List_Alter(LinkList &L,int i,int j,ElemType &e)
{
    //把第i个元素的值改为j,并用e保存原来第i个元素的值
    LinkList p;
    p=L;
    int ele=0;
    while(p&&ele<i)
    {
        p=p->next;
        ele++;
    }
    if(!p||ele>i)
        return ERROR;
    e=p->data;
    p->data=j;
    return OK;
}

Status List_Search(LinkList &L,int i,ElemType &e)
{//查找第i个元素,并用e返回其值
    LinkList p;
    p=L;
    int j=0;
    while(p)
    {
        p=p->next;
        j++;
        if(j==i)
            break;
    }
    if(!p)
        return ERROR;
    e=p->data;
    return OK;
}

void getLinkList(LinkList &L)
{
    LinkList p;
    p=L->next;
    cout<<"当前链表:"<<endl;
    while(p)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
int main()
{
    LinkList L;
    int n,e;
    cout<<"请输入链表长度:"<<endl;
    cin>>n;
    cout<<"请逆序输入n个元素的值:"<<endl;
    CreatList_L(L,n);
    getLinkList(L);
    cout<<"请输入查找元素的位置:"<<endl;
    int i;
    cin>>i;
    if(List_Search(L,i,e))
    {
        cout<<"该元素的值为:"<<e<<endl;
    }
    else
    {
        cout<<"查找失败!"<<endl;
    }
    cout<<"请输入想插入元素的位置:"<<endl;
    int j;
    cin>>j;
    cout<<"插入元素的值为:"<<endl;
    int p;
    cin>>p;
    if(ListInsert_L(L,j,p))
    {
        cout<<"插入成功!"<<endl;
        getLinkList(L);
    }
    else
    {
        cout<<"插入失败!"<<endl;
        getLinkList(L);
    }
    cout<<"请输入想要删除元素的位置:"<<endl;
    int q;
    cin>>q;
    if(ListDelete_L(L,q,e))
    {
        cout<<"删除成功!"<<endl;
        cout<<"删除元素的值为:"<<e<<endl;
        getLinkList(L);
    }
    else
    {
        cout<<"删除失败!"<<endl;
        getLinkList(L);
    }
    cout<<"请输入想要修改元素的位置:"<<endl;
    int k;
    cin>>k;
    cout<<"请输入想要修改元素的值:"<<endl;
    int l;
    cin>>l;
    if(List_Alter(L,k,l,e))
    {
        cout<<"修改成功!"<<endl;
        cout<<"原来元素的值为:"<<e<<endl;
        getLinkList(L);
    }
    else
    {
        cout<<"修改失败!"<<endl;
        getLinkList(L);
    }
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值