数据结构2.2--线性表的链式实现

//linkList.h


#pragma once
#ifndef _LINK_LIST
#define _LINK_LIST

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

#define OK 1
#define ERROR 0

//创建线性表(链表)
int createList(LinkList &, int);

//获取线性表中的元素
int getElem(LinkList, int, int &);

//向线性表中插入元素
int listInsert(LinkList &, int, int);

//删除线性表中的元素
int listDel(LinkList &, int, int &);

//合并两张线性表
int mergeList(LinkList &, LinkList &, LinkList &);

#endif // !1


//linkList.cpp

#include "linkList.h"
#include <cstdlib>

//创建线性表(链表)
int createList(LinkList &L, int n)
{
    L = (LinkList)malloc(sizeof(LNode));    //创建头结点
    L->next = 0;
    for (int i = 0; i < n; ++i)
    {
        LNode *p = (LinkList)malloc(sizeof(LNode));        //创建新节点
        p->data = i;
        p->next = L->next;
        L->next = p;
    }
    return OK;
}

//获取线性表中的元素
int getElem(LinkList L, int i, int &nElem)
{
    LNode *p = L->next;
    int j = 1;                //计数器
    //在节点不为空的前提下后移指针
    while (p && j < i)
    {
        p = p->next;
        ++j;
    }
    //第i个数不存在
    if (!p || j > i)
        return ERROR;
    nElem = p->data;
    return OK;
}

//向线性表中插入元素
int listInsert(LinkList &L, int i, int nElem)
{
    LNode *p = L;
    int j = 0;                //计数器
    while (p && j < i - 1)
    {
        p = p->next;
        ++j;
    }
    //i小于1或者大于表长加1
    if (!p || j > i - 1)
        return ERROR;
    LNode *s = (LinkList)malloc(sizeof(LNode));        //生成新指针
    s->data = nElem;                //创建新节点
    s->next = p->next;
    p->next = s;
    return OK;

}

//删除线性表中的元素
int listDel(LinkList &L, int i, int &nElem)
{
    LNode *p = L;
    int j = 0;                //计数器
    //查找i节点
    while (p->next && j < i - 1)
    {
        p = p->next;
        ++j;
    }
    //删除的位置不合理
    if (!(p->next) || j > i - 1)
        return ERROR;
    LNode *q = (LinkList)malloc(sizeof(LNode));
    q = p->next;
    p->next = q->next;
    nElem = q->data;
    free(q);
    return OK;
}

//合并两张线性表
int mergeList(LinkList &Ll, LinkList &Lr, LinkList &Ld)
{
    LNode *pl = (LinkList)malloc(sizeof(LNode));
    LNode *pr = (LinkList)malloc(sizeof(LNode));
    LNode *pd = (LinkList)malloc(sizeof(LNode));
    pl = Ll->next;
    pr = Lr->next;
    //Ll的头结点作为目标线性表的头结点
    Ld = pd = Ll;
    while (pl && pr)
    {
        if (pl->data <= pr->data)
        {
            pd->next = pl;
            pd = pl;
            pl = pl->next;
        }
        else
        {
            pd->next = pr;
            pd = pr;
            pr = pr->next;
        }
    }
    //合并剩余字段
    pd->next = pl ? pl : pr;
    free(Lr);
    return OK;
}


//main.cpp
#include <iostream>
#include "linkList.h"
#include <cstdlib>

int main()
{
    using std::cout;
    using std::endl;

    srand(NULL);
    int n = rand() % 15;
    //创建线性表
    cout << "创建线性表" << endl;
    LinkList L;
    createList(L, n);
    //样例输出
    for (LNode *p = L->next; p != NULL; p = p->next)
        cout << p->data << " ";
    cout << endl;

    cout << "添加数据" << endl;
    listInsert(L, n + 1, n + 1);
    //样例输出
    for (LNode *p = L->next; p != NULL; p = p->next)
        cout << p->data << " ";
    cout << endl;

    cout << "删除数据" << endl;
    int nDelElem = 0;
    listDel(L, n - 1, nDelElem);
    //样例输出
    for (LNode *p = L->next; p != NULL; p = p->next)
        cout << p->data << " ";
    cout << endl;

    cout << "合并线性表" << endl;
    LinkList Ll, Lr, Ld;
    createList(Ll, n);
    createList(Lr, n);
    mergeList(Ll, Lr, Ld);
    //样例输出
    for (LNode *p = Ld->next; p != NULL; p = p->next)
        cout << p->data << " ";
    cout << endl;

    system("pause");
    return 0;
}


转载于:https://my.oschina.net/suprock/blog/638910

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值