链式存储结构的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、线性表的链表实现:插入、删除、翻转
2、链式堆栈的实现
3、链式队列的基本操作
实验目的:掌握单链表,链式堆栈,链式队列的定义及基本操作
实验内容:
(1)用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同值。链表的头结点存放链表后面的结点个数,初始化时就生成头结点(初值为0)。链表翻转是把数据逆序(变成降序),注意,头结点不动。翻转后要再翻转一次,恢复升序后才能插入新元素,否则会出错
(2)先定义堆栈的几个基本操作,再设计一主函数利用堆的操作完成以下功能:假设一个算术表达式中可以包含三种括号:()[]{},且这三种括号可以按任意次序嵌套使用(如:...[...{...}...[...]...]...(...))。编写判别给定表达式中所含括号是否正确配对出现的算法,已知表达式已存入数据元素为字符的单链表中。
(3)先定义队列的几个基本操作,再设计一主函数利用队列的操作完成以下功能:键盘输入的字符可以临时存入键盘的缓冲区中。为了充分利用缓冲区的空间,往往将缓冲区设计成链式循环队列的结构,并为循环队列结构的缓冲区设置一个队首指针和一个队尾指针。每输入一个字符到缓冲区中,就将尾指针后移,链入缓冲区的循环队列之中;每输出一个字符号,就将队头指针前移,将它从缓冲队列中删除。假设有两个进程同时存在于一个应用程序中,第一个进程连续在屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输入,若有则读入用户键入的字符,将其保存到键盘缓冲区中。
(1)//LinList.h
template
template
class ListNode
{
friend class LinList
friend void LinListSort(LinList
private:
ListNode
T data; //定义为公有成员方便使用
int size;
public:
//构造函数1,用于构造头结点
ListNode(ListNode
{size=0;next = ptrNext;}
//构造函数2,用于构造其他结点
ListNode(const T& item, ListNode
{data = item; next = ptrNext; }
~ListNode(void){} //析构函数
};
//单链表类的定义
template
{
friend void LinListSort(LinList
private:
ListNode
int size; //当前的数据元素个数
ListNode
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
{
head = new ListNode
size = 0; //size的初值为0
}
template
LinList
{
ListNode
p = head; //p指向第一个结点
while(p != NULL) //循环释放结点空间直至初始化状态 {
q = p;
p = p->next;
delete q;
}
size = 0; //结点个数置为初始化值0
head = NULL;
}
template
ListNode
//返回指向第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
int j = 0; //从0开始计数
while(p != NULL && j < i) //寻找第i个结点
{
p = p->next;
j++;
}
return p; //返回第i个结点的指针
}
template
int LinList
return size;
}
template
void LinList
//在第i个结点后插入一个元素值为item的新结点
//参数i的取值范围为:0≤i≤size
{
if(i < 0 || i > size)
{
cout << "参数i越界出错!" << endl;
exit(0);
}
ListNode
//构造新结点p,p的data域值为item,next域值为p->next
ListNode
p->next = q; //新结点插入第i个结点前
size++; //元素个数加1
}
template
T LinList
//删除第i个数据元素并返回。参数i的取值范围为:0≤i≤size-1 {