《数据结构》之单链表

单链表

线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的)。

下面直接上代码实现(注:使用的是C++语言)

#include <iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int ElemType;
typedef int Status;

typedef struct LNode
{
    ElemType data;             //数据域
    struct LNode *next;        //指针域
}LNode, *LinkList;            //*LinkList结构体类型指针

Status InitList(LinkList &L)  //初始化
{
    L=new LNode;//生成新的结点作为头结点,用头指针L指向头结点
    L->next=NULL;  //头结点的指针域置空
    return OK;
}

void  CreateList_H(LinkList &L) //头插法创建单链表
{
    int n;
    cout<<"请输入元数个数:"<<endl;
    cin>>n;
    cout<<"每个元素输入时请用空格隔开:"<<endl;
    L=new LNode;
    L->next =NULL;   //先建立一个带头结点的空链表
    LNode *p;
    for (int i=0; i<n; ++i)
    {
        p=new LNode;   //生成新的结点*p
        cin>>p->data;  //输入的元素值赋给新结点*p的数据域
        p->next=L->next;  //将新结点*p插入到头结点之后
        L->next=p;
    }
    cout <<"链表创建完毕!!!"<<endl;
    cout<<"当前的链表的元素为:";
    p=L->next;   //将指针p指回首元结点,才能正常输出
    if (p==NULL) cout<<"链表为空!!!"<<endl;
    while (p!=NULL)
    {
        cout <<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}

Status ListInsert(LinkList &L)//单链表插入元素
{
    int i,e;
    cout<<"请输入插入元素的位置:"<<endl;
    cin>>i;
    cout<<"请输入插入的元素为:"<<endl;
    cin>>e;
    int j;
    LNode *s,*p;
    p=L;
    j=0;
    while (p && (j<i-1))//查找第i-1个结点,p指向结点
    {
        p=p->next;
        j=j+1;
    }
    if (!p || (j>i-1))  //i>n+1或者i<1
    {
        cout<<"位置错误!!!"<<endl;
        return ERROR;
    }
        s=new LNode;  //生成新的结点*s
        s->data=e;    //将结点*s的数据域置为e
        s->next=p->next;  //将结点*s的指针域指向结点ai
        p->next=s;        //将结点*p的指针域指向结点*s
        cout<<"元素插入成功!!!:"<<endl;
        cout<<"当前的链表的元素为:";
        p=L->next;
        if (p==NULL) cout<<"链表为空!!!"<<endl;
        while (p!=NULL)//输出部分
       {
        cout <<p->data<<" ";
        p=p->next;
       }
       cout<<endl;
       return OK;
}

Status ListDelete(LinkList &L)//单链表删除元素
{
    int i;
    cout<<"请输入删除的元素的位置:"<<endl;
    cin>>i;
    int j;
    LNode *p,*q;
    p=L;     //将p指向头结点
    j=0;
    while ((p->next) && (j<i-1))//寻找要删除的位置
    {
        p=p->next;
        ++j;
    }
    if (!(p->next) || (j>i-1))//当i>n或i<1时删除位置不合理
    {
        cout<<"删除位置错误!!!"<<endl;
        return ERROR;
    }
        q=p->next;  //临时保存被删除结点的地址以备释放
        p->next=q->next;  //改变删除结点前驱结点的指针域
        delete q;  //释放删除结点的空间
        cout<<"元素删除成功:"<<endl;
        cout<<"当前的链表的元素为:";
        p=L->next;
        if (p==NULL) cout<<"链表为空!!!"<<endl;
        while (p!=NULL)//又再输出
       {
        cout <<p->data<<" ";
        p=p->next;
       }
       cout<<endl;
       return OK;
}
//********************************功能实现函数**************************************//
//菜单
void menu()
{
    cout<<"(************1.创建               2.插入************)"<<endl;
    cout<<"(************3.删除               4.退出************)"<<endl;
}

因为代码比较长,所以用截图表示主函数部分了!在这里插入图片描述
本文目的是供大家参考关于链表代码实现,这里大部分的代码在(《数据结构》严蔚敏 李冬梅 吴伟民 著有),同时也是记录自己实训的成长希望大家能有收获!Thank you !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值