链表多种功能实现代码完整版

一,详细代码

#include<iostream>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
//创建链表 
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*Linklist;
Status Initlist(Linklist &L);
void Creatlist_H(Linklist &L,int n);
void Creatlist_R(Linklist &L,int n); 
void Showlist(Linklist L);
Status ListInsert(Linklist &L,int i,ElemType e);
Status ListDelete(Linklist &L,int i);
Status GetElem(Linklist L,int i,ElemType &e);
int Listlength(Linklist L);
Status Listsort(Linklist &L);
void SortListInsert(Linklist &L,ElemType e);
//初始化
Status Initlist(Linklist &L)
{
    L=new LNode;
    if(!L) return ERROR;
    L->next=NULL;
    return OK;
 } 
 //前插法 
void Creatlist_H(Linklist &L,int n)
{
    int i;
    LNode *p;
    L=new LNode;
    L->next=NULL;
    for(i=0;i<n;i++)
    {
        p=new LNode;
        cout<<"第"<<i+1<<"个数=";
        cin>>p->data;
        p->next=L->next; 
        L->next=p;
    }
}
//尾插法 
void Creatlist_R(Linklist &L,int n)
{
    int i;
    L=new LNode;
    L->next=NULL;
    LNode *p,*r;
    r=L;
    for(i=0;i<n;i++){
        p=new LNode;
        p->next=NULL;
        cout<<"第"<<i+1<<"个数=";
        cin>>p->data ;
        r->next=p;
        r=p;
    }
}
//输出 
void Showlist(Linklist L)
{
    LNode *p=L->next;
    while(p)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
//插入 
Status ListInsert(Linklist &L,int i,ElemType e)
{
    LNode *p=L;
    int j=0;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||j<i-1)
    return ERROR;
    LNode *s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
//删除 
Status ListDelete(Linklist &L,int i)
{
    LNode *p,*q;
    p=L;
    int j=0;
    while((p->next)&&j<i-1) 
    {
        j++;
        p=p->next;
    }
    if(p->next==NULL||j>i+1)
    return ERROR;
    q=p->next;
    p->next=q->next;
    delete q;
    return OK;
}
//取值 
Status GetElem(Linklist L,int i,ElemType &e)
{
    LNode *p=L->next;
    int j=1;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if((!p)||j>i) return ERROR;
    e=p->data;
    return OK;
}
//计算长度 
int Listlength(Linklist L)
{
   int len=0;
   LNode*p;
   p=L->next;
       while(p!=NULL)
       {
           p=p->next;
           len++;
    }
    return len;    
 } 
//冒泡排序
Status Listsort(Linklist &L)
{
    int len=Listlength(L);
    if(len==0)  return ERROR;
    LNode*p,*q;
    ElemType t;
    int i,j;
    for(i=0;i<len-1;i++){
        p=L->next;
        q=p->next;
    for(j=0;j<len-1;j++)
    {
        if(p->data<q->data)
        {
            t=p->data;
            p->data=q->data;
            q->data=t; 
        }
        p=p->next;
        q=q->next;
    }
  }
  return OK;

//有序插入
void SortListInsert(Linklist &L,ElemType e)
{
    LNode*q=L;
    LNode*p=L->next;
    while(p!=NULL&&p->data>e)
    {
        q=p;
        p=p->next;
     } 
     LNode*s=new LNode;
     s->data=e;
     s->next=p;
     q->next=s;
}
int main()
{
    Linklist L;
    ElemType e;
    LNode *p;
    int choice,n,i;
    while(1)
    {
        cout<<"1,初始化 2,头插法 3,尾插法 4,显示"<<endl;
        cout<<"5,插入 6,删除 7,取值" <<endl;
        cout<<"8,排序  9,有序插入"<<endl ;
        cout<<"选项=";
        cin>>choice;
        switch(choice)
        {
            case 1:
                if(Initlist(L)==OK)
                cout<<"链表初始化成功!"<<endl;
            else
                cout<<"链表初始化错误!"<<endl;
                break;
            case 2:
                //头插法
                cout<<"创建个数="<<endl;
                cin>>n;
                Creatlist_H(L,n);
                break;
            case 3:
                 cout<<"创建个数="<<endl;
                 cin>>n;
                 Creatlist_R(L,n);
                 break;
            case 4:
                Showlist(L);
                break;
            case 5:
                cout<<"插入数据=";
                cin>>e;
                cout<<"插入位置=";
                cin>>i;
                if(ListInsert(L,i,e)==OK)
                        cout<<"数据插入成功"<<endl;
                    else
                        cout<<"数据插入失败"<<endl;
                break;
            case 6:
            cout<<"删除位置=";
            cin>>i;
            if(ListDelete(L,i)==OK)
             cout<<"删除成功!"<<endl;
             else
             cout<<"删除失败!"<<endl;
             break;
            case 7:
                cout<<"取值位置=";
                cin>>i;
                if(GetElem(L,i,e)==OK)
                
                    cout<<"取值="<<e<<endl;
                else
                    cout<<"取值失败!"<<endl;
                    break; 
            case 8:
                if(Listsort(L)==OK)
                  cout<<"排序成功!"<<endl;
                else
                cout<<"链表为空!"<<endl;
                break;
                case 9:
                    cout<<"插入数据=";
                    cin>>e;
                     SortListInsert(L,e);
                     break;
                case 0:
                    return 0;
                    break;
                    default:
                        cout<<"选项输入错误"<<endl; 
        }
        system("pause");
        system("cls");
    }
    return 0;
}

二,预告

此代码同样使用了菜单的实现形式,可以把此菜单改写成多文件形式,通过划分不同的头文件和cpp文件,即可实现。

在之后会发布多文件形式的链表,并且会发布队列和栈的系列代码,敬请期待!

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值