山东大学《数据结构》实验三:线性表操作

实验三 线性表操作

一、实验目的

1、掌握线性表的基本操作:插入、删除、查找。
2、掌握链表遍历器的使用方法。

二、实验内容

1、输入 n 个不为零的整数作为节点元素值,遇到 0 代表输入结束(不创 建元素值为 0 的节点),创建有序链表。输出整个链表。
2、输入一个整数,将该数插入到有序表相应位置。输出整个链表。
3、输入一个整数,在链表中进行搜索,输出其在链表中的位置。如果不 存在输出 0。
4、再一次输入一个整数,在链表中进行搜索,输出其在链表中的位置。 如果不存在输出 0。
5、再一次输入 n 个不为零的整数作为节点元素值,遇到 0 代表输入结束 (不创建元素值为 0 的节点),创建有序链表。输出整个链表。
6、使用链表遍历器实现上面两个有序链表的合并,输出合并后的链表。
7、提示:注意单节点链表的测试。

代码如下:

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<string.h>
using namespace std;
struct chainNode{//结点类
    chainNode(){}
    chainNode(const int& element){this->element=element;}
    int element;
    chainNode *next;    
};
class chain{//链表类
public:
    chain(){firstNode=NULL;listSize=0;}
    void insert(const int& theE);//插入方法
    int indexOf(const int theE);//查找指定元素的位置
    void print();//打印链表
    friend chain combine(const chain c1,const chain c2);//合并两个链表,返回新链表

    int listSize;
    chainNode* firstNode;
};
void chain::insert(const int& theElement){
    chainNode* s=new chainNode(theElement);
    if(listSize==0){//在空链表中插入第一个结点 
        firstNode=s;
        s->next=NULL;
        listSize++;
        return;
    }
    chainNode* cur=firstNode;
    chainNode* p;
    int index=1;
    for(;index<listSize+1&&cur->element<theElement;index++){
        p=cur;//记录cur的前一个
        cur=cur->next; 
    }
    if(index==1){//插入头结点    
        s->next=cur;
        firstNode=s;
    }
    else{//插入中间的结点or尾 
        p->next=s;
        s->next=cur;
    }
    listSize++; 
}

int chain::indexOf(const int theElement){
    chainNode* cur=firstNode;
    int index=1;
    while(cur!=NULL&&cur->element!=theElement){
        cur=cur->next;
        index++;
    }
    if(cur==NULL) return 0;
    else return index;
}
void chain::print(){
    chainNode* p=firstNode;
    while(p->next!= NULL){
        cout<<p->element<<",";
        p=p->next;
    }
    cout<<p->element<<endl;
}
chain combine(const chain c1,const chain c2){
    chain c3;
    chainNode* p=c1.firstNode;
    chainNode* s;
    while(p!=NULL){
        c3.insert(p->element);
        s=p;
        p=p->next;
    }
    s=c2.firstNode;
    while(s!=NULL){
        c3.insert(s->element);
        s=s->next;
    }
    return c3;
}
int main(){
    chain c1,c2,c3;
    int temp;
    cout<<"Input1"<<endl;
    while(cin>>temp&&temp!=0)
        c1.insert(temp);
    cout<<"Output1"<<endl;
    c1.print();
    cout<<"Input2"<<endl;
    cin>>temp;
    c1.insert(temp);
    cout<<"Output2"<<endl;
    c1.print();
    cout<<"Input3"<<endl;
    cin>>temp;
    cout<<"Output3"<<endl;
    cout<<c1.indexOf(temp)<<endl;
    cout<<"Input4"<<endl;
    cin>>temp;
    cout<<"Output4"<<endl;
    cout<<c1.indexOf(temp)<<endl;
    cout<<"Input5"<<endl;
    while(cin>>temp&&temp!=0)
        c2.insert(temp);
    cout<<"Output5"<<endl;
    c2.print();
    c3=combine(c1,c2);
    c3.print();
    cout<<"End"<<endl;    
    return 0;
} 

结论分析与体会:

回顾了链表的插入,查找,和输出,在写合并方法时顺便复习了上学期C++课程关于友元函数的讲解。
发布了11 篇原创文章 · 获赞 0 · 访问量 36

猜你喜欢

转载自blog.csdn.net/weixin_43959421/article/details/103973878