线性表的链式表示及实现

//线性表的链式表示及实现
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <malloc.h>
using namespace std;
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define MAX_SIZE 100
typedef int Status;
typedef int ElemType;
typedef struct node
{
    ElemType data;//数据域
    struct node *next;//指针域
} LNode, *LinkList;
//在带头结点的单链线性表L中第i个位置之前插入元素e
Status ListInsert(LinkList &L, int i, ElemType e);
//获取单链表中第i个元素的值
Status GetElem(LinkList L, int i, ElemType &e);
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
Status ListDelete(LinkList &L, int i, ElemType &e);
//逆序输入n个元素的值,建立代表头结点的单链线性表L
void CreateList(LinkList &L, int n);
//将单链线性表输出
void Print(LinkList L);
//将两个有序链表并为一个有序链表
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc);
int main()
{
    LinkList L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    int i;
    CreateList(L, 5);
    Print(L);
    for(i = 0; i < 5; i++)
    {
        ListInsert(L, 0, i);
    }
    Print(L);
    int e;
    GetElem(L, 3, e);//获取第三个位置的元素的值
    printf("可输出第三个位置的值为%d\n", e);
    ListDelete(L, 3, e);//删除第三个位置的元素
    printf("删除后的遍历:");
    Print(L);
    LinkList La, Lb, Lc;
    La = (LinkList)malloc(sizeof(LNode));
    La->next = NULL;
    Lb = (LinkList)malloc(sizeof(LNode));
    Lb->next = NULL;
    CreateList(La, 4);
    CreateList(Lb, 7);
    //以逆序创建链表为例 La 11, 8, 5, 3; Lb 20, 15, 11, 9, 8, 6, 2
    MergeList(La, Lb, Lc);
    Print(Lc);
    return 0;
}
//在带头结点的单链线性表L中第i个位置之前插入元素e
Status ListInsert(LinkList &L, int i, ElemType e)
{
    LinkList pre = L;
    int j = 0;
    while(pre && (j < i-1))//寻找第i-1个结点
    {
        pre = pre->next;
        j++;
    }
    if(!pre || i<0)//i小于0或者大于表长加1
    {
        return ERROR;
    }
    LinkList q;
    q = (LinkList)malloc(sizeof(LNode));
    q->next = pre->next;
    pre->next = q;
    q->data = e;
    return OK;
}
//获取单链表中第i个元素的值
Status GetElem(LinkList L, int i, ElemType &e)
{
    //L为带头结点的单链表的头指针
    //当第i个元素存在时,其赋值给e并返回OK,否则返回ERROR
    LinkList p = L->next;
    int j = 1;
    while(p && (j<i))
    {
        p = p->next, j++;
    }
    if(!p || (j>i))//第i个元素不存在
    {
        return ERROR;
    }
    e = p->data;//取第i个元素
    return OK;
}
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
Status ListDelete(LinkList &L, int i, ElemType &e)
{
    LinkList p = L;
    int j = 1;
    while(p->next && (j<i))//寻找第i个结点,并且p指向其前驱
    {
        p = p->next, j++;
    }
    if(!p->next || (i < 1))
    {
        return ERROR;
    }
    LinkList q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);
    return OK;
}
//逆序输入n个元素的值,建立代表头结点的单链线性表L
void CreateList(LinkList &L, int n)
{
    LinkList p = L;
    int i;
    printf("请输入%d个带插入元素:", n);
    for(i = n; i > 0; i--)
    {
        LinkList q = (LinkList)malloc(sizeof(LNode));
        q->next = p->next;
        p->next = q;
        int num;
        scanf("%d", &num);
        q->data = num;
    }
}
//将单链线性表输出
void Print(LinkList L)
{
    LinkList p = L->next;
    while(p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
//将两个有序链表并为一个有序链表
/** 已知单链线性表La和Lb的元素按值非递减排列
    归并La和Lb得到新的单链线性表Lc,Lc也按值非递减排列*/
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
    Lc = (LinkList)malloc(sizeof(LNode));
    Lc->next = NULL;
    LinkList pa, pb, pc;
    pa = La->next, pb = Lb->next;//, pc = Lc->next
    Lc = pc = La;
    while(pa&&pb)
    {
        printf("%d %d\n",pa->data, pb->data);
        if(pa->data <= pb->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    pc->next = pa?pa:pb;// 插入剩余段
    free(Lb);//释放Lb头结点
}

猜你喜欢

转载自blog.csdn.net/weixin_42480264/article/details/81286932
今日推荐