实验项目:线性表的链接存储结构的实现
实验目的:熟悉链式表的逻辑特性、存储表示方法的特点和链式表的基本操作。
实验要求:了解并熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作的实现和应用。
实验内容:
编写程序实现下列的要求:
(1) 设数据元素为整数,实现这样的线性表的链式存储表示。
(2) 键盘输入10个数据元素,利用链表的基本操作,建立该表,完成插入和删除运算。
(3) 利用链表的基本操作,找出表中的最大的和最小的数据元素(用于比较的数据元素为整数)。
#include <iostream>
using namespace std;
const int MaxSize = 100;
struct Node {
int data; //数据域
Node* next; //指针域
};
class LinkList {
public:
LinkList(); //无参构造函数
LinkList(int a[], int n); //有参构造函数
~LinkList(); //析构函数
int Length();
int Get(int i);
int Locate(int x);
void Insert(int i, int x); //插入
int Delete(int i); //删除
void PrintList();
private:
Node *first; //单链表的头指针
};
//无参构造函数-单链表的初始化
LinkList::LinkList() {
first = new Node; //生成头结点
first->next = NULL; //头结点的指针域置空
}
//有参构造函数——建立单链表
/*
//头插法
LinkList::LinkList(T a[], int n) {
first = new Node<T>;
first->next = NULL; //初始化一个空链表
for(int i = 0; i < n; i++) {
Node*s = NULL;
s = new Node;
s->data = a[i];
s->next = first->next;
first->next = s; //将结点s插入到头结点后
}
}*/
//尾插法
LinkList::LinkList(int a[], int n) {
first = new Node; //生成头结点
Node *r = first, *s = NULL; //尾指针初始化
for(int i = 0; i < n; i++) {
s = new Node;
s->data = a[i]; //为每个数据元素建立一个结点
r->next = s;
r = s; //将结点s插入到终端结点之后
}
r->next = NULL; //单链表建立完毕,将终端结点的指针域置空
}
//插入操作
void LinkList::Insert(int i, int x) {
Node*p = first, *s = NULL;
int count = 0;
while (p != NULL && count < i - 1) { //查找第i-1个结点
p = p->next; //工作指针p后移
count++;
}
if(p == NULL) throw "插入位置错误"; //没有找到第i-1个结点
else {
s = new Node;
s->data = x; //申请结点s,数据域为x
s->next = p->next;
p->next = s; //将结点s插入到结点p之后
}
}
//删除操作
int LinkList::Delete(int i) {
int x;
Node *p = first, *q = NULL;
int count = 0;
while(p != NULL && count < i - 1) { //查找第i-1个结点
p = p->next;
count++;
}
if(p == NULL || p->next == NULL) //结点p不存在或p的后继结点不存在
throw "删除位置错误";
else {
q = p->next;
x = q->data; //暂存被删结点
p->next = q->next; //摘链
delete q;
return x;
}
}
//按值查找
int LinkList::Locate(int x) {
Node *p = first->next; //工作指针P初始化
int count = 1; //累加器count初始化
while (p != NULL) {
if(p->data == x) return count; //查找成功返回序号
p = p->next;
count++;
}
return 0; //退出循环表明查找失败
}
//按位查找
int LinkList::Get(int i) {
Node*p = first->next; //工作指针p初始化
int count = 1; //累加器count初始化
while(p != NULL && count < i) {
p = p->next; //工作指针p后移
count++;
}
if(p == NULL)throw "查找位置错误";
else return p->data;
}
//单链表遍历算法
void LinkList::PrintList() {
Node *p = first->next; //工作指针p初始化
while(p != NULL) {
cout << p->data << "\t";
p = p->next; //工作指针p后移,注意不能写作p++
}
cout << endl;
}
//析构函数
LinkList::~LinkList() {
Node *q = NULL;
while(first != NULL) {
q = first;
first = first->next;
delete q;
}
}
int main() {
cout << "请输入要定义的单链表的元素个数:n=";
int n ; //定义线性表的元素个数
cin >> n; //输入n
int a[n];
int i, x;
cout << "输入数据元素:" << endl;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
LinkList l( a, n);
cout << "当前线性表的数据为:";
l.PrintList();
int max = -1000000;
int min = 1000000;
for (int i = 0; i < 10; i++) {
if(a[i] > max) max = a[i];
if(a[i] < min) min = a[i];
}
cout << "最大元素为:" << max << endl;
cout << "最小元素为:" << min << endl;
cout << "请输入要插入的位置i" << endl;
cin >> i;
cout << "请输入要插入的数x" << endl;
cin >> x;
cout << "在第i个位置插入x" << endl;
l.Insert(i, x);
cout << "执行插入操作后数据为:";
l.PrintList();
cout << "请输入要删除的元素位置i" << endl;
cin >> i;
x = l.Delete(i);
cout << "删除的元素是" << x << ",删除后数据为:";
l.PrintList();
}