//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