链表的基本操作

C++链表的基本操作

#include <iostream>

using namespace std;

typedef int ElemType;

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

void InitList(LinkList &l);
void Create_head(LinkList &l);
void Create_rear(LinkList &l);
void InsertList(LinkList &l, int i, ElemType e);
int DelList(LinkList &l, int i, ElemType *e);
LNode *Pos(LinkList &l, int i);
void Output(LinkList l);

void Show()
{
    cout << "****************链表基本操作******************\n";
    cout << "     1. 初始化                2.头插入法创建\n";
    cout << "     3. 尾插入法创建           4.插入一个元素\n";
    cout << "     5. 删除一个元素           6.查找\n";
    cout << "     7. 输出                  8.菜单\n";
    cout << "     9.退出\n";
    cout << "**********************************************\n";
    cout << "输入1-9之间的数:" << endl;
}

int main()
{
    Show();
    LinkList l;
    int n;
    while (1)
    {
        cout << "请输入你要操作的元素序号:";
        cin >> n;
        switch (n)
        {
        case 1:
        {
            InitList(l);
            break;
        }
        case 2:
        {
            cout << "请依次输入数据,并以-1作为结束标记:" << endl;
            Create_head(l);
            break;
        }
        case 3:
        {
            cout << "请依次输入数据,并以-1作为结束标记:" << endl;
            Create_rear(l);
            break;
        }
        case 4:
        {
            int  i, n;
            cout << "请依次输入你要插入的位置和元素:";
            cin >> i >> n;
            InsertList(l, i, n);
            break;
        }
        case 5:
        {
            ElemType e;
            int i;
            cout << "请输入你要删除的位置:";
            cin >> i;
            DelList(l, i, &e);
            break;
        }
        case 6:
        {
            cout << "请输入你要查找的位置:";
            int i;
            cin >> i;
            LNode *p = Pos(l, i);
            cout << "该位置的值为:" << p->data << endl;
            break;
        }
        case 7:
        {
            Output(l);
            break;
        }
        case 8:
        {
            Show();
            break;
        }
        case 9:
        {
            exit(0);
            break;
        }
        default:
        {
            cout << "非法的数字序号!!!" << endl;
        }
        }
    }
    return 0;
}

void InitList(LinkList &l)
{
    l = new LNode;
    l->next = NULL;
}

void Create_rear(LinkList &l)
{
    int n;
    LNode *p = l;
    while (1)
    {
        cin >> n;
        if (n == -1)
            break;
        LNode *s = new LNode;
        s->data = n;
        p->next = s;
        p = s;
    }
    p->next = NULL;
}

void Create_head(LinkList &l)
{
    int n;
    while (1)
    {
        cin >> n;
        if (n == -1)
            break;
        LNode *s = new LNode;
        s->data = n;
        s->next = l->next;
        l->next = s;
    }
}

LNode *Pos(LinkList &l, int i)
{
    LNode *p = l;
    while (i--)
    {
        p = p->next;
        if (p == NULL)
        {
            cout << "寻找位置已超过链表长度!!!" << endl;
            break;
        }
    }
    return p;
}

int DelList(LinkList &l, int i, ElemType *e)
{
    LNode *pre, *r;
    int k;
    pre = l;
    k = 0;
    while (pre->next != NULL&&k < i - 1)
    {
        pre = pre->next;
        k++;
    }
    if (!(pre->next))
    {
        cout << "删除位置不合理!!!" << endl;
        return 0;
    }
    r = pre->next;
    pre->next = r->next;
    *e = r->data;
    free(r);
    return 1;
}

void InsertList(LinkList &l, int i, ElemType e)
{
    LNode *p, *s;
    p = Pos(l, i - 1);
    s = new LNode;
    s->data = e;
    s->next = p->next;
    p->next = s;
}

void Output(LinkList l)
{
    LNode *p;
    p = l->next;
    while (p)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值