数据结构实验报告(二)——二叉树基本操作_数据结构实验报告二叉树的基本操作-CSDN博客https://blog.csdn.net/luohaojia123/article/details/127905639?spm=1001.2014.3001.5501数据结构实验报告(三)——图的操作和实现_图的基本操作数据结构实验总结与体会(问题及解决方案、收获与感想等,不低于500字)-CSDN博客https://blog.csdn.net/luohaojia123/article/details/128690098?spm=1001.2014.3001.5501数据结构实验报告(四)——查找和排序算法_查找算法的设计与实现实验报告-CSDN博客https://blog.csdn.net/luohaojia123/article/details/128690401?spm=1001.2014.3001.5501
实验目的
-
掌握线性表、栈和队列的基本操作;
-
实现线性表的查找、插入、删除等基本操作;
-
实现链栈的初始化、入栈、出栈和取栈顶元素等基本操作;
-
实现链式队列的初始化、入队、出队等基本操作。
实验原理
链表:每个结点不仅存入数据,还有指向下一结点的指针。
链栈:先进后出,实际上就是一个只能采用头插法插入或删除数据的链表。
链队:先进先出,实际上就是一个只能采用尾插法插入数据、头删法删除数据的链表。
实验源码
链表
定义
typedef struct Link{
int elem;
struct Link *next;
}link;
创建链表
link* createLink(){
link *head=new link; //创建一个头结点
link *p=head; //创建指针
cout<<"链表长度:";
int n;
cin>>n;
int data;
while(n--){
cin>>data;
link *tmp=new link;
tmp->elem=data;
tmp->next=NULL;
p->next=tmp;
p=p->next;
}
return head;
}
插入结点
link* insertElem(link *L,int pos,int elem){
link *p=L; //L为头指针
//找到目标的前一个结点
for(int i=1;i<pos;i++){
p=p->next;
if(p->next==NULL){
cout<<"插入位置错误!"<<endl;
return L;
}
}
link *newNode=new link;
newNode->elem=elem;
newNode->next=p->next;
p->next=newNode;
return L;
}
删除结点
link* deleteElem(link *L,int pos){
link *p=L;
//找到目标的前一个结点
for(int i=1;i<pos;i++){
p=p->next;
if(p->next==NULL){
cout<<"没有该结点"<<endl;
return L;
}
}
link *delElem=p->next;
p->next=p->next->next;
delete delElem;
return L;
}
查找结点
int findElem(link *L,int elem){
link *p=L;
p=p->next;
int i=1;
while(p->next){
if(p->elem==elem) return i;
p=p->next;
i++;
}
return -1;
}
更新结点
link* updateElem(link *L,int pos,int elem){
link *p=L;
p=p->next;
for(int i=1;i<pos;i++){
if(p->next==NULL){
cout<<"没有该结点"<<endl;
return L;
}
p=p->next;
}
p->elem=elem;
return L;
}
销毁链表
void destroy(link *L){
link *p;
while(L){
p=L;
L=L->next;
delete p;
}
}
打印
void display(link *L){
link *p=L;
while(p->next){
p=p->next;
cout<<p->elem<<" ";
}
cout<<endl;
}
main
int main(){
cout<<"初始化"<<endl;
link *L=createLink();
cout<<"插入结点 (第3个位置插入元素8)"<<endl;
L=insertElem(L,3,8);
display(L);
cout<<"删除结点 (删除第2个元素)"<<endl;
L=deleteElem(L,2);
display(L);
cout<<"查找结点 (查找元素3,返回索引)"<<endl;
cout<<findElem(L,3)<<endl;
cout<<"更新结点 (更改第1个元素)"<<endl;
L=updateElem(L,1,100);
display(L);
cout<<"销毁链表"<<endl;
destroy(L);
return 0;
}
运行结果
链队
定义
typedef struct Queue{
int elem;
struct Queue *next;
}qNode;
入队
qNode* enQueue(qNode *rear,int elem){
//尾插法
qNode *newNode=new qNode;
newNode->elem=elem;
newNode->next=NULL;
rear->next=newNode;
rear=newNode;
cout<<"入队:"<<elem<<endl;
return rear;
}
出队
qNode* outQueue(qNode *top,qNode *rear){
if(top->next==NULL){
cout<<"队列无元素!"<<endl;
return rear;
}
qNode *p=top->next;
cout<<"出队:"<<p->elem<<endl;
top->next=top->next->next;
if(rear==p) rear=top;
delete p;
return rear;
}
main
int main(){
qNode *qHead,*top,*rear;
rear=new qNode;
rear->next=NULL;
qHead=top=rear;
rear=enQueue(rear,1);
rear=enQueue(rear,2);
rear=enQueue(rear,3);
rear=enQueue(rear,4);
rear=outQueue(top,rear);
rear=outQueue(top,rear);
rear=outQueue(top,rear);
rear=outQueue(top,rear);
rear=outQueue(top,rear);
return 0;
}
运行结果
链栈
定义
typedef struct LinkStack{
int elem;
struct LinkStack *next;
}linkStack;
入栈
linkStack *push(linkStack *sHead,int elem){
//头插法
linkStack *newNode=new linkStack;
newNode->elem=elem;
newNode->next=sHead->next;
sHead->next=newNode;
return sHead;
}
出栈
linkStack *pop(linkStack *sHead){
//删除首元结点
if(sHead->next){
linkStack *p=sHead->next;
sHead->next=sHead->next->next;
cout<<"弹出元素:"<<p->elem<<"\t";
if(sHead->next){
cout<<"当前栈顶元素:"<<sHead->next->elem<<endl;
}else{
cout<<"栈空"<<endl;
}
delete p;
}else{
cout<<"出栈失败!栈里没有元素!"<<endl;
return sHead;
}
return sHead;
}
main
int main(){
//创建头结点
linkStack *sHead=new linkStack;
sHead->next=NULL;
sHead=push(sHead,1);
sHead=push(sHead,2);
sHead=push(sHead,3);
sHead=push(sHead,4);
sHead=pop(sHead);
sHead=pop(sHead);
sHead=pop(sHead);
sHead=pop(sHead);
sHead=pop(sHead);
return 0;
}
运行结果
实验心得
-
创建链表时,注意创建新结点要给其next赋值(或者在typedef时用类的构造函数赋予默认值),不然会出错
-
链表操作中,插入和删除操作,先判断相应的操作位置是否合理,插入位置有n+1个,删除元素有n个,然后查找到目标结点的前一个结点,再进行操作。
-
链栈和链队是操作受限的链表,按链表的操作即可。
链栈:先进后出,实际上就是一个只能采用头插法插入或删除数据的链表。
链队:先进先出,实际上就是一个只能采用尾插法插入数据、头删法删除数据的链表。