您的位置:首页 > 理论基础 > 数据结构算法

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

2016-03-17 00:00 381 查看
摘要: 存取增删o(n),物理地址不一定相邻

//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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: