#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType data; //存放单个节点的数据
struct Node* next; //存放下个节点的地址
}Node,*LinkList;
Status visit(ElemType c);
Status InitList(LinkList* L);
Status EmptyList(LinkList L);
Status ClearList(LinkList* L);
Status DestroyList(LinkList* L);
int ListLength(LinkList L);
Status GetElem(LinkList L, int i, ElemType* e);
int LocateElem(LinkList L, ElemType e);
Node* LocateElem2(LinkList L, ElemType e);
Status ListInsert(LinkList* L, int i, ElemType e);
Status ListDelete(LinkList* L, int i, ElemType* e);
Status ListTraverse(LinkList L);
void CreatListHead(LinkList* L, int n);
void CreatListTail(LinkList* L, int n);
void MerGeList(LinkList La,LinkList Lb,LinkList &Lc);
//输出链表中的数据
Status visit(ElemType c)
{
cout << c << " ";
return OK;
}
//初始化链表
Status InitList(LinkList *L)
{
*L = new Node;
if (!(*L)) //初始化失败
return ERROR;
(*L)->next = NULL;
}
//判断链表是否为空,如果为空,返回FALSE,否则返回TRUE
Status EmptyList(LinkList L)
{
if (L->next)
return FALSE;
else
return TRUE;
}
//清空链表,保留头指针(头结点)
Status ClearList(LinkList *L)
{
LinkList p, q;
p = (*L)->next; //p指针指向首元结点
while (p)
{
q = p->next;
delete p;
p = q;
}
(*L)->next = NULL; //将首元结点置空
return OK;
}
//销毁链表,从头结点开始销毁
Status DestroyList(LinkList* L)
{
//LinkList p;
//while (*L)
//{
// p = (*L); //p指针指向头结点
// (*L) = (*L)->next;
// delete p;
//}
//可以直接清空链表,再销毁头结点
ClearList(L);
delete L;
return OK;
}
//链表存在,返回除头结点外的结点个数
int ListLength(LinkList L)
{
int i = 0;
LinkList p = L->next; //p指向首元结点
while (p) //p不为空
{
i++; //计数器加1
p = p->next; //将p指向下一结点
}
return i; //返回结点个数
}
//链表存在,在链表中查找第i个位置的元素,用e返回,如果链表为空,e不在链表中,或者查找位置不合理,返回ERROR
Status GetElem(LinkList L,int i,ElemType *e)
{
int j = 1;
LinkList p = L->next;
while (p &&j<i)
{
p = p->next;
j++;
}
if (!p || j > i) //!p,p的地址为空 说明e不在链表中 ||j > i,查找位置不合理
return ERROR;
*e = p->data;
return OK;
}
//链表存在,在链表中查找元素e,用i返回元素的位置
int LocateElem(LinkList L,ElemType e)
{
int i = 0;
LinkList p = L->next;
while (p)
{
i++;
if (p->data == e)
return i;
p = p->next;
}
return 0; //找不到或者链表为空,返回0;
}
//链表存在,在链表中查找元素e,返回元素p结点的指针
Node* LocateElem2(LinkList L,ElemType e)
{
LinkList p = L->next;
while (p)
{
if (p->data == e)
return p;
p = p->next;
}
return p;
}
//链表的插入
Status ListInsert(LinkList*L,int i,ElemType e)
{
int j = 0; // j要从0开始,p是从L开始
LinkList p, s;
p = *L; //从头结点开始可以插入
while (p &&j<i-1) //查找插入节点位置的前一个节点(前驱)
{
p = p->next;
++j;
}
if (!p || j > i - 1)
return ERROR;
s = new Node; //创建新结点
s->data = e;
s->next = p->next; //将插入结点的next指向对应的后继位置
p->next = s; //插入结点的前驱的next指向插入结点
return OK;
}
//链表的删除
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j=0;
LinkList p, q;
p = *L;
while (p->next &&j<i-1)
{
p = p->next;
++j;
}
if (!(p->next) || j > i - 1)
return ERROR;
q = p->next;
p->next = q->next;
*e = q->data;
delete q;
return OK;
}
//遍历链表
Status ListTraverse(LinkList L)
{
LinkList p = L->next;
while (p)
{
visit(p->data);
p = p->next;
}
cout << endl;
return OK;
}
//头插
void CreatListHead(LinkList *L,int n)
{
LinkList p;
*L = new Node;
(*L)->next = NULL;
for (int i=0;i<n;i++)
{
p = new Node;
cin >> p->data;
p->next = (*L)->next;
(*L)->next = p;
}
}
//尾插
void CreatListTail(LinkList* L, int n)
{
LinkList p,r;
*L = new Node;
r = *L;
for (int i = 0; i < n; i++)
{
p = new Node;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
//有序链表合并
void MerGeList(LinkList La, LinkList Lb, LinkList& Lc)
{
Node* pa, * pb, * pc;
Lc = pc = La;
pa = La->next;
pb = Lb->next;
while (pa &&pb)
{
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;
delete Lb;
}
int main()
{
LinkList L;
LinkList Lb, Lc;
ElemType e;
Status i;
i = InitList(&L);
for (int j = 1; j <= 10; j++)
{
ListInsert(&L, 1, j);
}
cout << "在表头依次插入1~10后,data=";
ListTraverse(L);
i = EmptyList(L);
cout << "L是否为空(1.是 0.否)" << i << endl;
i = ClearList(&L);
cout << "清空L后,ListLength(L)=" << ListLength(L) << endl;
i = EmptyList(L);
cout << "L是否为空(1.是 0.否)" << i << endl;
for (int j = 1; j <= 10; j++)
{
ListInsert(&L, j, j);
}
cout << "在表尾依次插入1~10后,data=";
ListTraverse(L);
int j = 1;
while (j <= 5)
{
i = ListDelete(&L, 1, &e);
++j;
}
cout << "从表头依次删除5个元素以后" << endl;
ListTraverse(L);
j = 5;
while (j != 3)
{
i = ListDelete(&L, j, &e);
j--;
}
cout << "从表尾依次删除2个元素以后" << endl;
ListTraverse(L);
i = ClearList(&L);
cout << "清空L后,ListLength(L)=" << ListLength(L) << endl;
cout << "插入元素(头插法)" << endl;
CreatListHead(&L, 5);
cout << "整体创建L的元素(头插法)" << endl;
ListTraverse(L);
i = ClearList(&L);
cout << "清空L后,ListLength(L)=" << ListLength(L) << endl;
i = EmptyList(L);
cout << "L是否为空(1.是 0.否)" << i << endl;
cout << "插入元素(尾插法)" << endl;
CreatListTail(&L, 5);
cout << "整体创建L的元素(尾插法)" << endl;
ListTraverse(L);
i = ClearList(&L);
cout << "清空L后,ListLength(L)=" << ListLength(L) << endl;
i = EmptyList(L);
cout << "L是否为空(1.是 0.否)" << i << endl;
cout << "插入元素(尾插法)" << endl;
CreatListTail(&L, 5);
cout << "整体创建L的元素(尾插法)" << endl;
ListTraverse(L);;
InitList(&Lb);
cout << "插入元素(尾插法)" << endl;
CreatListTail(&Lb, 5);
cout << "整体创建Lb的元素(尾插法)" << endl;
ListTraverse(Lb);
InitList(&Lc);
MerGeList(L, Lb, Lc);
cout << "有序合并L,Lb后,Lc=" << endl;
ListTraverse(Lc);
return 0;
}