链式存储结构的基本操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、线性表的链表实现:插入、删除、翻转

2、链式堆栈的实现

3、链式队列的基本操作

实验目的:掌握单链表,链式堆栈,链式队列的定义及基本操作

实验内容:

(1)用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同值。链表的头结点存放链表后面的结点个数,初始化时就生成头结点(初值为0)。链表翻转是把数据逆序(变成降序),注意,头结点不动。翻转后要再翻转一次,恢复升序后才能插入新元素,否则会出错

(2)先定义堆栈的几个基本操作,再设计一主函数利用堆的操作完成以下功能:假设一个算术表达式中可以包含三种括号:()[]{},且这三种括号可以按任意次序嵌套使用(如:...[...{...}...[...]...]...(...))。编写判别给定表达式中所含括号是否正确配对出现的算法,已知表达式已存入数据元素为字符的单链表中。

(3)先定义队列的几个基本操作,再设计一主函数利用队列的操作完成以下功能:键盘输入的字符可以临时存入键盘的缓冲区中。为了充分利用缓冲区的空间,往往将缓冲区设计成链式循环队列的结构,并为循环队列结构的缓冲区设置一个队首指针和一个队尾指针。每输入一个字符到缓冲区中,就将尾指针后移,链入缓冲区的循环队列之中;每输出一个字符号,就将队头指针前移,将它从缓冲队列中删除。假设有两个进程同时存在于一个应用程序中,第一个进程连续在屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输入,若有则读入用户键入的字符,将其保存到键盘缓冲区中。

(1)//LinList.h

template class LinList; //前视定义,否则友元无法定义

template //模板类型为T

class ListNode

{

friend class LinList; //定义类LinList为友元

friend void LinListSort(LinList &L);

private:

ListNode *next; //指向下一结点的指针

T data; //定义为公有成员方便使用

int size;

public:

//构造函数1,用于构造头结点

ListNode(ListNode *ptrNext = NULL)

{size=0;next = ptrNext;}

//构造函数2,用于构造其他结点

ListNode(const T& item, ListNode *ptrNext = NULL)

{data = item; next = ptrNext; }

~ListNode(void){} //析构函数

};

//单链表类的定义

template

{

friend void LinListSort(LinList &L);

private:

ListNode *head; //头指针

int size; //当前的数据元素个数

ListNode *Index(int i); //定位

public:

LinList(void); //构造函数

~LinList(void); //析构函数

int ListSize(void) const; //取当前数据元素个数

void Insert(const T& item, int i); //前插

T Delete(int i); //删除

T GetData(int i); //取元素

void OrderInsert(T x);

void Converse(void);

};

//单链表类的实现

template

LinList::LinList(void) //构造函数

{

head = new ListNode(); //头指针指向头结点

size = 0; //size的初值为0

}

template

LinList::~LinList(void) //析构函数

{

ListNode *p, *q;

p = head; //p指向第一个结点

while(p != NULL) //循环释放结点空间直至初始化状态 {

q = p;

p = p->next;

delete q;

}

size = 0; //结点个数置为初始化值0

head = NULL;

}

template

ListNode *LinList::Index(int i) //定位

//返回指向第i个数据元素结点的指针

//参数i的取值范围为:-1≤i≤size-1;i=-1时返回头指针

{

if(i < -1 || i > size-1)

{

cout << "参数i越界出错!" << endl;

exit(0);

}

if(i == -1) return head; //i为-1时返回头指针head

ListNode *p = head->next; //p指向第一个数据元素结点

int j = 0; //从0开始计数

while(p != NULL && j < i) //寻找第i个结点

{

p = p->next;

j++;

}

return p; //返回第i个结点的指针

}

template

int LinList::ListSize(void) const //取当前数据元素个数并返回{

return size;

}

template

void LinList::Insert(const T& item, int i) //插入

//在第i个结点后插入一个元素值为item的新结点

//参数i的取值范围为:0≤i≤size

{

if(i < 0 || i > size)

{

cout << "参数i越界出错!" << endl;

exit(0);

}

ListNode *p = Index(i - 1); //p为指向第i-1个结点的指针

//构造新结点p,p的data域值为item,next域值为p->next

ListNode *q = new ListNode(item, p->next);

p->next = q; //新结点插入第i个结点前

size++; //元素个数加1

}

template

T LinList::Delete(int i) //删除

//删除第i个数据元素并返回。参数i的取值范围为:0≤i≤size-1 {

相关文档
最新文档