//线性表的链式表示及实现
#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头结点
}