数据结构——单链表的操作

深入理解链表表的逻辑结构,物理结构等概念,掌握链表的基本操作的编程实现,掌握C语言中指针的操作

头文件:

源文件:

//main函数
#include <iostream>
#include"LNode.h"
using namespace std;

int main()
{
    cout<<"如果想要开始程序,请输入“Y”"<<endl;
    char i;
    cin>>i;
    if(i=='Y'){
        Print();
        LinkList L;
        LinkList p;
        Menu(L);
        //cout<<"HelloWorld!"<<endl;
    }
    return 0;
}

//头文件
#ifndef LNODE_H_INCLUDED
#define LNODE_H_INCLUDED
#include<iostream>
using namespace std;

typedef int Status;
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

//初始化单链表
Status InitList(LinkList &L);
//销毁单链表
Status DestroyList(LinkList &L);
//清空单链表
Status ClearList(LinkList L);
//求单链表的长度
Status ListLength(LinkList L);
//判断单链表是否为空
bool ListEmpty(LinkList L);
//单链表的按位置查找
Status LinkList_id(LinkList L,int num);
//单链表的按值查找
Status LocateElem_L(LinkList L,ElemType e);
//求第i个元素的直接前驱
Status PriorElem(LinkList L,int i);
//求第i个元素的直接后继
Status NextElem(LinkList L,int i);
//在单链表的第i个位置插入一个元素
Status LinkListInsert(LinkList L,int i,ElemType e);
//将单链表中第i个数据元素删除
Status ListLinkDelete(LinkList L,int i/*,ElemType &e*/);
//创建单链表
void CreatList_R(LinkList &L,LinkList p,int n);
//遍历输出单链表
void PrintList(LinkList L);
//显示选择功能
void Print();
//选择功能
Status Menu(LinkList L);
#endif // LNODE_H_INCLUDED

//源文件
#include<iostream>
#include"LNode.h"

#define OK 1
#define OVERFLOW -2
#define ERROR 0
using namespace std;


//初始化单链表
Status InitList(LinkList &L){
    L=new LNode;
    if(!L)exit(OVERFLOW);
    L->next=NULL;
    return OK;
}
//销毁单链表
Status DestroyList(LinkList &L){
    LinkList p;
    while(L){
        p=L;
        L=L->next;
        delete p;
    }
    return OK;
}
//创建单链表——后插法
void CreatList_R(LinkList &L,LinkList p,int n){
    L=new LNode;
    L->next=NULL;
    LinkList r;
    r=L;
    for(int i=0;i<n;i++){
        p=new LNode;
        cin>>p->data;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}
//清空单链表
Status ClearList(LinkList L){
    LinkList p,q;
    p=L->next;
    while(p){
        q=p->next;
        delete p;
        p=q;
    }
    L->next=NULL;
    return 0;
}
//求单链表的长度
Status ListLength(LinkList L){
    LinkList p=L->next;
    int acount=0;
    while(p){
        ++acount;
        p=p->next;
    }
    return acount;
}
//判断单链表是否为空
bool ListEmpty(LinkList L){
    return L->next!=NULL;
}
//单链表的按位置查找
Status LinkList_id(LinkList L,int num){
    int len=ListLength(L);
    if(num<1||num>len){
        cout<<"查找位置不合法!"<<endl;
    }
    LinkList p=L->next;
    for(int i=1;i<num;i++){
        p=p->next;
    }
    int res=p->data;
    return res;
}
//求前驱
Status PriorElem(LinkList L,int num){
    int len=ListLength(L);
    if(num-1<1||num>len){
        cout<<"查找位置不合法!"<<endl;
    }
    LinkList p=L;
    for(int i=1;i<num;i++){
        p=p->next;
    }
    int res=p->data;
    return res;
}
//求后继
Status NextElem(LinkList L,int num){
    int len=ListLength(L);
    if(num+1<1||num>len){
        cout<<"查找位置不合法!"<<endl;
    }
    LinkList p=L->next->next;
    for(int i=1;i<num;i++){
        p=p->next;
    }
    int res=p->data;
    return res;
}
//单链表的按值查找
Status LocateElem_L(LinkList L,ElemType e){
    LNode *p=L;
    int len=0;
	while(p&&(p->data!=e))
	{
		p=p->next;
		len++;
	}
	if(len<=ListLength(L))
        return p->data;
    else
        return ListLength(L)+1;
}
//在单链表的第i个位置插入一个元素
Status LinkListInsert(LinkList L,int i,ElemType e){
    LinkList p=L;int j=0;LNode* s;
    while(p&&j<i-1){
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)return ERROR;
    s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
//将单链表中第i个数据元素删除
Status ListLinkDelete(LinkList L,int i/*,ElemType &e*/){
    LinkList p=L;int j=0;LNode* r;
    while(p->next&&j<i-1){
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>i-1)return ERROR;
    r=p->next;
    p->next=r->next;
    //e=r->data;
    delete r;
    return OK;
}
//遍历输出单链表
void PrintList(LinkList L){
    LinkList p=L->next;
    if(ListLength(L)>0){
        cout<<"当前单链表的所有元素为:"<<endl;
        while(p){
            cout<<p->data<<" ";
            p=p->next;
        }
        cout<<endl;
    }
    else cout<<"当前单链表已为空!"<<endl;
}
//显示选择功能
void Print(){
    cout<<"####################欢迎来到单链表的世界!#####################"<<endl;
    cout<<"#-------------------0 -------退出程序-------------------------#"<<endl;
    cout<<"#-------------------1 -------初始化一个单链表-----------------#"<<endl;
    cout<<"#-------------------2 -------单链表表中添加元素(后插法):----#"<<endl;
    cout<<"#-------------------3 -------销毁单链表:----------------------#"<<endl;
    cout<<"#-------------------4 -------清空单链表:----------------------#"<<endl;
    cout<<"#-------------------5 -------判断单链表是否为空:--------------#"<<endl;
    cout<<"#-------------------6 -------求单链表的长度:------------------#"<<endl;
    cout<<"#-------------------7 -------获取单链表指定位置的元素:--------#"<<endl;
    cout<<"#-------------------8 -------在单链表中查找值为e的元素:-------#"<<endl;
    cout<<"#-------------------9 -------求前驱:------------------------- #"<<endl;
    cout<<"#-------------------10 ------求后继---------------------------#"<<endl;
    cout<<"#-------------------11-------在单链表的指定位置插入元素-------#"<<endl;
    cout<<"#-------------------12-------删除单链表指定位置的元素:--------#"<<endl;
    cout<<"#-------------------13-------输出当前单链表:------------------#"<<endl;
    cout<<"请选择要执行的功能:"<<endl;
}
//选择功能
Status Menu(LinkList L){
    int num;
    cin>>num;
    int count=0;
    while(num)
    {
        switch(num)
        {
        case 0:
            num=0;
            break;
        case 1:
            InitList(L);
            count++;
            cout<<"单链表初始化完成!"<<endl;
            break;
        case 2:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            int n;
            cout<<"请输入插入个数:";
            cin>>n;
            LinkList p;
            cout<<"请插表:";
            CreatList_R(L,p,n);
            cout<<"单链表创建完成!"<<endl;
            break;
        case 3:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            DestroyList(L);
            count--;
            cout<<"单链表已销毁!"<<endl;
            break;
        case 4:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            ClearList(L);
            cout<<"单链表已清空!"<<endl;
            break;
        case 5:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            else if(ListEmpty(L))
                cout<<"单链表不为空!"<<endl;
            else
                cout<<"单链表为空!"<<endl;
            break;
        case 6:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            cout<<"单链表的长度为:"<<ListLength(L)<<endl;
            break;
        case 7:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            cout<<"请输入要查找的元素的位置:";
            int num;
            cin>>num;
            if(num<1||num>ListLength(L)){cout<<"查找位置不合法"<<endl;break;}
            else
            cout<<"第"<<num<<"位的元素为"<<LinkList_id(L,num)<<endl;
            break;
        case 8:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            cout<<"请输入要查找的元素:";
            int index;
            cin>>index;
            if(LocateElem_L(L,index)>ListLength(L)){
                cout<<"该元素在单链表中不存在!"<<endl;
            }else
            cout<<"元素"<<index<<"在单链表中存在,取值为:"<<LocateElem_L(L,index)<<endl;
            break;
        case 9:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            cout<<"请输入要查找的元素的序号:";
            int x;
            cin>>x;
            if(x<=1||x>ListLength(L)){cout<<"查找位置不合法"<<endl;break;}else
            cout<<x<<"号元素"<<"的直接前驱为:"<<PriorElem(L,x)<<endl;
            break;
        case 10:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            cout<<"请输入要查找的元素的序号:";
            int s;
            cin>>s;
            if(s<1||s>=ListLength(L)){cout<<"查找位置不合法"<<endl;break;}else
            cout<<s<<"号元素"<<"的直接后继为:"<<NextElem(L,s)<<endl;
            break;
        case 11:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            cout<<"请输入要插入的位置以及要插入的元素(以空格分)"<<endl;
            int a,b;
            cin>>a;cin>>b;
            if(a<1||a>ListLength(L)){cout<<"插入位置不合法"<<endl;break;}
            else if( LinkListInsert(L,a,b)==OK)
                cout<<"已完成指定位置元素的插入"<<endl;
            break;
        case 12:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            cout<<"请输入要删除的位置的元素"<<endl;
            int m;
            cin>>m;
            if(m<1||m>ListLength(L)){cout<<"删除位置不合法"<<endl;break;}
            ListLinkDelete(L,m);
            cout<<"已完成指定位置元素的删除"<<endl;
            break;
        case 13:
            if(count==0){
                cout<<"请初始化一个单链表"<<endl;
                break;
            }
            PrintList(L);break;
        }
        cout<<"请再次选择功能:"<<endl;
        cin>>num;
    }
}

 

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值