线性表基本操作的实现(演示单链表的创建、插入、删除、查找、输出等操作),通过简单实例测试各基本操作函数算法的正确性。
LinkList.h
#include <iostream>
using namespace std;
typedef char ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode* Next;
}LNode,*LinkList;
int InitList(LinkList& L)
{
//初始化只含有头结点的空的单链表
L = new LNode;
if (L == NULL)
{
cout << "结点分配失败\n";
return 0;
}
L->Next = NULL;
return 1;
}
void ClearList(LinkList& L)
{
//清空单链表,仅保留头节点
LinkList p;
while (L->Next)
{
p = L->Next;
L->Next = p->Next;
delete p;
}
}
int ListLength(LinkList L)
{
//返回单链表的长度
LinkList P = L;
int i = 0;
while (P->Next) //数到最后一个结点为止
{
i++;
P = P->Next;
}
return i;
}
void PrintList(LinkList L)
{
//顺序输出单链表中的各元素
LinkList p = L->Next;
while (p!=NULL)
{
cout << p->data << " ";
p = p->Next;
}
cout << endl;
}
bool ListEmpty(LinkList L)
{
//判断是否为空链表
if (L->Next == NULL)
return true;
else
return false;
}
int GetElem(LinkList L, int i, ElemType& e)
{
//用e返回单链表L中第i个元素的值
if (i < 1) return 0;
LinkList p = L->Next;
int j = 1;
while (j<i&&p!=NULL)
{
p = p->Next;
j++;
}
if (p == NULL)//j<i,但p为空指针了,即i超出了[i...n]范围了
return 0;
else
{
e = p->data;
return 1;
}
}
int LocateElem(LinkList L, ElemType e)
{
//返回e元素在单链表L中的位序,如不存在,返回0
LinkList p = L->Next;
int i = 1;
while (p!=NULL&&p->data!=e)
{
p = p->Next;
i++;
}
if (p == NULL)
return 0;
else
return i;
}
int Listinsert(LinkList &L, int i, ElemType e)
{
//在单链表L的第i个数据元素之前插入数据e
if (i < 1) return 0;
int j = 0;
LinkList p = L,s;
while (j<i-1&&p!=NULL)
{
p = p->Next;
j++;
}
if (p == NULL)
return 0;
else
{
s = new LNode;
if (s == NULL) {
cout << "结点分配失败\n";
return 0;
}
s->data = e;
s->Next = p->Next;
p->Next = s;
return 1;
}
}
int ListDelete(LinkList& L, int i, ElemType &e)
{
//删除单链表L中第i个结点,并用e返回其值
if (i < 1) return 0;
LinkList p = L, q;
int j = 0;
while (j<i-1&&(p->Next)!=NULL)
{
p = p->Next;
j++;
}
if ((p->Next) == NULL)
return 0;
else
{
q = p->Next;
p->Next = q->Next;
e = q->data;
delete q;
return 1;
}
}
LinkList.cpp
#include "LinkList.h"
int main()
{
LinkList h;
ElemType e;
int i = 0;//位序
int t = 0;//位序返回值
cout << "(1)初始化单链表\n";
InitList(h);
cout << "(2)单链表为:" << (ListEmpty(h) ? "空" : "非空")<<endl;
cout << "(3)依次输入字母序列,以'#'结束:" << endl;
cin >> e;
i = 1;
while(e != '#')
{
Listinsert(h, i, e);
i++;
cin >> e;
}
cout << "(4)输出单链表:";
PrintList(h);
cout << "(5)单链表的长度为:" << ListLength(h) << endl;
cout << "(5)单链表为:" << (ListEmpty(h) ? "空" : "非空") << endl;
cout << "(6)测试GetElem(L,i,e)函数,请输入i的值:";
cin >> i;
t = GetElem(h, i,e);
if (t) cout << "(6)单链表的第" << i << "个元素为:" << e << endl;
else cout << "(6)单链表的第" << i << "个元素" <<"不存在" << endl;
cout << "(7)测试LocateElem(L,e)函数,请输入e的值:";
cin >> e;
t = LocateElem(h, e);
if (t) cout << "(7)单链表中" << e<< "位置为:" << t << endl;
else cout << "(7)单链表中" << e << "不存在" << endl;
cout << "(8)测试ListInsert(L,i,e)函数,请输入i和e的值:"<<endl;
cout << "i:";
cin >> i;
cout << "e:";
cin >> e;
cout << "(8)在第" << i << "个元素位置上插入" << e << "元素:";
t = Listinsert(h, i, e);
if (t) cout << "插入成功"<<endl;
else cout << "插入失败"<<endl;
cout << "(9)输出单链表:";
PrintList(h);
cout<<"(10)测试ListDelete(L,i,e),请输入i的值:" << endl;
cin >> i;
cout << "(10)删除第" << i << "个元素:";
t = ListDelete(h, i, e);
if (t) cout << "删除成功" << endl;
else cout << "删除失败" << endl;
cout << "(11输出单链表:";
PrintList(h);
cout << "(12)释放单链表" << endl;
ClearList(h);
}
测试结果