数据结构--单链表

数据结构第二次更新,记录了单链表的学习,上传了包括 整表创建,插入,删除,取值,查找,获取长度,反转链表,整表销毁 等函数的代码。敲码不易,求赞,求关注,更希望大家能对我的代码多加指正,谢谢!

AC代码:

#include<iostream>
#define ElemType int
#define Status int
#define OK 1
using namespace std;

//  单链表结点数据结构;
typedef struct LNode
{
    ElemType data;   //  数据域;
    struct LNode *next;   // 指针域;
}LNode, *LinkList;
// ***********************************基本操作函数********************************//
// 初始化函数
Status InitList(LinkList &L)
{
    L=new LNode;   //  生成头结点;
    L->next=NULL;  //  头结点指针域置空;
    return OK;
}
// 创建函数----前插法;
bool CreateList_H(LinkList &L, int n)
{
    L = new LNode;
    L->next = NULL;
    LNode *p;
    for(int i=0; i<n; i++)
    {
        p = new LNode;
        cin>>p->data;
        p->next = L->next;
        L->next = p;
    }
    return true;
}
// 创建函数---后插法
bool CreateList_R(LinkList &L, int n)
{
    L = new LNode;
    L->next = NULL;
    LNode *r, *p;
    r = L;
    for(int i = 0; i<n; i++)
    {
        p = new LNode;
        cin>>p->data;
        p->next = NULL;
        r->next = p;
        r = p;
    }
    return true;
}
//  获取单链表长度 头结点无数据,不算
int ListLength(LinkList &L)
{
    LinkList p = L;
    int sum = 0;
    while(p)
    {
        sum++;
        p = p->next;
    }
    cout<<"该单链表的长度为:"<<sum-1<<endl;
    return sum-1;
}
//  逆转函数
void InverseList(LinkList &L)
{
   LNode *p = L->next;
    L->next = NULL;
    LNode *q;
    while(p )
    {
        q = p->next;
        p->next = L->next;
        L->next = p;
        p = q;
    }
}
//  插入函数--后插法,插到第 i 个(1<=i<=length+1)位置 即 i-1 之后的位置,不必区分 i 的位置
bool ListInsert(LinkList &L, int i, ElemType e)
{
    LNode *s;
    LinkList p = L;
    int j = 0;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p || j>i-1)
    {
        cout<<"插入位置无效!!!"<<endl;
        return false;
    }
    s = new LNode;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}
// 删除函数 删除位置 i 的结点 即删除 i-1 之后的结点
bool ListDelete(LinkList &L, int i)
{
    LNode *s;
    LinkList p = L;
    int j = 0;
    LinkList q;
    while(p->next && j<i-1)
    {
        p = p->next;
        j++;
    }
    if(!(p->next) || j>i-1)
    {
        cout<<"删除元素不存在!!!"<<endl;
        return false;
    }
    q = p->next;
    p->next = q->next;
    free(q); // 释放已删除结点的空间;
    return true;
}
//  查找函数 按值查找 查找第一个等于e的结点 成功返回该结点指针,否则返回NULL
LNode *LocateElem(LinkList &L, ElemType e)
{
    LNode *p = L;
    while(p && (p->data != e))
    {
        p = p->next;
    }
    if(p)
    {
        cout<<"查找成功!该元素的地址为:"<<p<<endl;
    }
    return p;
}
//  取值函数 获取第 i 个元素的数据
Status GetElem(LinkList &L, int i)
{
    LNode *p = L->next;
    int j = 1;
    while(p && j<i)
    {
        p = p->next;
        j++;
    }
    if(!p || j>i)
    {
        return false;
    }
    cout<<"取值成功!该元素为:"<<p->data<<endl;
    return true;
}
//  销毁函数 删除整个单链表
Status ClearList(LinkList &L)
{
    LinkList p, q;
    p = L->next;
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    L->next = NULL;
    return true;
}
//********************************功能实现函数************************************//
// 遍历输出函数
void PrintList(LinkList L)
{
    LinkList p = L->next;  //  跳过头结点;
    if(p)
    {
        cout<<"当前单链表所有元素为:";
        while(p)
        {
            cout<<p->data<<" ";
            p = p->next;
        }
        cout<<endl;
    }
    else
    {
        cout<<"当前单链表已空!"<<endl;
    }
}
// 创建功能函数---前插法
void Create_H(LinkList &L)
{
    int n;
    bool flag;
   cout<<"请输入你要创建单链表的长度:";
   cin>>n;
   cout<<"请输入你要创建单链表的元素:";
   flag = CreateList_H(L, n);
   if(flag)
   {
       cout<<"创建成功!"<<endl;
       PrintList(L);
   }
}
//  创建功能函数---后插法
void Create_R(LinkList &L)
{
    int n;
    bool flag;
    cout<<"请输入你要创建的单链表的长度:";
    cin>>n;
    cout<<"请输入你要创建的单链表的元素:";
    flag = CreateList_R(L, n);
    if(flag)
    {
        cout<<"创建成功!"<<endl;
        PrintList(L);
    }
}
// 获取长度功能函数
void GetLength(LinkList &L)
{
    ListLength(L);
}
//  插入功能函数 调用ListInsert后插
void Insert(LinkList &L)
{
    int place; ElemType e; bool flag;
    cout<<"请输入要插入的位置(从1开始)及元素:";
    cin>>place>>e;
    flag = ListInsert(L, place, e);
    if(flag)
    {
        cout<<"插入成功!"<<endl;
        PrintList(L);
    }
}
// 删除功能函数 调用ListDelete删除
void Delete(LinkList &L)
{
    int place; bool flag;
    cout<<"请输入要删除的位置(从1开始):";
    cin>>place;
    flag = ListDelete(L, place);
    if(flag)
    {
        cout<<"删除成功!"<<endl;
        PrintList(L);
    }
}
// 查找功能函数 调用LocateElem函数查找
void Search(LinkList &L)
{
    ElemType e; LNode *q;
    cout<<"请输入要查找的值:";
    cin>>e;
    q = LocateElem(L, e);
    if(!q)
        cout<<"查找失败!"<<endl;
}
// 取值功能函数 调用GetElem取值
void Get(LinkList &L)
{
    int place; bool flag;
    cout<<"请输入你要获取元素的位置(从1开始):";
    cin>>place;
    flag = GetElem(L, place);
    if(!flag)
        cout<<"取值失败!"<<endl;
}
//  逆转功能函数 调用InverseList 反转单链表
void Inverse(LinkList &L)
{
    cout<<"反转成功!"<<endl;
    InverseList(L);
    PrintList(L);
}
//  销毁功能函数 调用ClearList 销毁
void Clear(LinkList &L)
{
    bool flag;
    flag = ClearList(L);
    if(flag)
        cout<<"销毁成功!"<<endl;
}
//  菜单
void menu()
{
    cout<<"********1.创建--前插      2.创建--后插********"<<endl;
    cout<<"********3.插入            4.删除      ********"<<endl;
    cout<<"********5.查找            6.取值      ********"<<endl;
    cout<<"********7.长度            8.逆转      ********"<<endl;
    cout<<"********9.销毁            0.退出      ********"<<endl;
}
int main()
{
    LinkList L; int choice;
    InitList(L);
    while(1)
    {
        menu();
        cout<<"请输入你要进行的操作的序号:";
        cin>>choice;
        if(choice == 0)
            break;
        switch(choice)
        {
            case 1: Create_H(L); break;
            case 2: Create_R(L); break;
            case 3: Insert(L); break;
            case 4: Delete(L); break;
            case 5: Search(L); break;
            case 6: Get(L); break;
            case 7: GetLength(L); break;
            case 8: Inverse(L); break;
            case 9: Clear(L); break;
            default : cout<<"输入错误!"<<endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gofor.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值