当前位置: 代码网 > it编程>编程语言>C/C++ > 链表多种功能实现代码完整版

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

2024年07月31日 C/C++ 我要评论
/创建链表//初始化if(!return OK;//前插法int i;LNode *p;for(i=0;i<n;i++)cout<<"第"<<i+1<<"个数=";L->next=p;//尾插法int i;r=L;for(i=0;i<n;i++){cout<<"第"<<i+1<<"个数=";

一,详细代码

#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文件,即可实现。

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com