数据结构实验报告(一)——线性表、堆栈和队列的操作与实现

数据结构实验报告(二)——二叉树基本操作_数据结构实验报告二叉树的基本操作-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/luohaojia123/article/details/127905639?spm=1001.2014.3001.5501数据结构实验报告(三)——图的操作和实现_图的基本操作数据结构实验总结与体会(问题及解决方案、收获与感想等,不低于500字)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/luohaojia123/article/details/128690098?spm=1001.2014.3001.5501数据结构实验报告(四)——查找和排序算法_查找算法的设计与实现实验报告-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/luohaojia123/article/details/128690401?spm=1001.2014.3001.5501

实验目的

  1. 掌握线性表、栈和队列的基本操作;

  1. 实现线性表的查找、插入、删除等基本操作;

  1. 实现链栈的初始化、入栈、出栈和取栈顶元素等基本操作;

  1. 实现链式队列的初始化、入队、出队等基本操作。

实验原理

链表:每个结点不仅存入数据,还有指向下一结点的指针。

链栈:先进后出,实际上就是一个只能采用头插法插入或删除数据的链表。

链队:先进先出,实际上就是一个只能采用尾插法插入数据、头删法删除数据的链表。

实验源码

链表

定义

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;
}
运行结果

实验心得

  1. 创建链表时,注意创建新结点要给其next赋值(或者在typedef时用类的构造函数赋予默认值),不然会出错

  1. 链表操作中,插入和删除操作,先判断相应的操作位置是否合理,插入位置有n+1个,删除元素有n个,然后查找到目标结点的前一个结点,再进行操作。

  1. 链栈和链队是操作受限的链表,按链表的操作即可。

链栈:先进后出,实际上就是一个只能采用头插法插入或删除数据的链表。

链队:先进先出,实际上就是一个只能采用尾插法插入数据、头删法删除数据的链表。

  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值