寒假数据结构基础(一)

断点调试

由于在开发程序的过程中会出现一些报错,这个时候我们就可以用断点调试,一步一步的看源代码执行过程中,发现代码的错误所在。一般都是在某一行设置一个断点,调试时,程序运行到这一行就会停止,然后就可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码即可,然后进行找到和分析处理这个Bug。

线性表

逻辑结构:线性结构,非线性结构。

储存方式:链式储存,顺序存储。

定义:就是n个数据类型相同的元素组成的有序集合。

特点:(1)只有一个开始节点,它没有前驱(因为开始节点是第一个元素,前面没有元素)。

(2)只有一个终端节点,它没有后继(因为是最后一个元素,后面没有元素了)。

线性表的顺序储存(顺序表)

定义:是指用一组连续的地址来储存数据元素,而且它们的逻辑顺序和物理顺序一致。

特点:(1)逻辑顺序和物理顺序一致

(2)只要知道第一元素的地址,我们就可以对线性表中的任意元素随机存取。

代码:

#include <iostream>
#define MaxLen 100
using namespace std; 
typedef int DateType;
typedef struct
{
    DateType date[MaxLen];
    int length;
}SeqList;
//顺序表的初始化
void InitList(SeqList *L)//初始化顺序表L函数
{
    L->length=0;
}
//顺序表的建立
void SetList(SeqList *L,int n)//建立顺序表并输入多个元素函数
{
    int i;
    cout<<"请输入"<<n<<"个整数"<<endl;
    for(i=0;i<n;i++)
    {
        cin>>L->date[i];
    }
    L->length=n;
}
//查找操作
void Getdate(SeqList *L,int x)//在顺序表中定位元素x的函数
{
    int flag=0;
    if(L->length<=0) cout<<"顺序表为空"<<endl;
    else 
        for(int i=0;i<L->length;i++)
        {
            if(x==L->date[i])
                {
                    cout<<"顺序表中第"<<i+1<<"个位置元素值为"<<x<<endl;
                    flag=1;
                }
        }
        if(!flag) cout<<"在顺序表中未找到值为"<<x<<"的元素"<<endl;
}
//插入操作
int InsList(SeqList *L,int k,int x)//在顺序表中第k位插入新元素x的函数
{
    int i;
    if(L->length==MAXLEN) 
    {
        cout<<"顺序表已满"<<endl;
        return -1;
    }
    if(k<=0||k>L->length+1)
    {
        cout<<"插入位置错误"<<endl;
        return 0;
    }
    if(k==L->length)
        {
            L->date[k]=x;
            L->length++;
            return 1;
        }
    for(i=L->length-1;i>=k-1;i--)
        L->date[i+1]=L->date[i];
    L->date[k-1]=x;
    L->length++;
    return 1;
}
//删除操作
int Deldate(SeqList *L,int k)//在顺序表中删除第k位元素的函数
{
    int i,j;
    if(L->length<=0)
    {
        cout<<"顺序表为空!"<<endl;
        return 0;
    }
    if(k<=0||k>L->length)
    {
        cout<<"删除位置不存在"<<endl;
        return 0;
    }
    j=L->date[k-1];
    for(i=k;i<L->length;i++)
    {
        L->date[i-1]=L->date[i];
    }
    cout<<"删除元素为:"<<j<<endl;
    L->length--;
    return 1;
}
//输出表中元素
void PriList(SeqList *L)//显示输出顺序表中的元素
{
    int i;
    for(i=0;i<L->length;i++)
        cout<<L->date[i]<<"     ";
    cout<<endl;
}
void Menu()//显示菜单子函数
{
     cout<<endl<<"            "<<"顺序表的各种操作";
     cout<<endl<<"********************************************";
     cout<<endl<<"|             1.建立顺序表                  |";
     cout<<endl<<"|             2.插入元素                    |";
     cout<<endl<<"|             3.删除元素                    |";
     cout<<endl<<"|             4.查找元素                    |";
     cout<<endl<<"|             5.求顺序表的长度               |";
     cout<<endl<<"|             0.返回                        |";
     cout<<endl<<"********************************************";
     cout<<endl<<"             请输入菜单号(0—5):           "<<endl;
}
int main()
{
        SeqList L;
        DateType x;
        int i,j,k,p=1,n;
        L.length=0;
        while(p!=0)
        {
            Menu();
            cin>>p;
            switch(p)
            {
            case     1:
                InitList(&L);
                cout<<"请输入要加入元素的个数:"<<endl;
                cin>>n;
                SetList(&L,n);
                cout<<"建立的线性表为:"<<endl;
                PriList(&L);
                break;
            case     2:
                cout<<"请输入要插入的位置:"<<endl;
                 cin>>k;
                 cout<<"请输入要插入的元素:"<<endl;
                 cin>>x;
                 if(InsList(&L,k,x))
                 {
                    cout<<"在第"<<k<<"个位置插入的数据为"<<x<<"插入后的顺序表为:"<<endl;
                    PriList(&L);
                 }
                 else
                 {
                     cout<<"输入的数据有误!"<<endl;
                 }
                 break;
            case     3:
                cout<<"输入要删除的元素的位置:"<<endl;
                cin>>x;
                    if(Deldate(&L,x));
                    {
                        if(L.length>0)
                        {
                            cout<<"删除指定元素后的顺序表为:"<<endl;
                            PriList(&L);
                        }
                        else
                            cout<<"删除指定元素后的顺序表为空!"<<endl;
                    }
 
                break;
            case     4:
                cout<<"输入你要查找的元素:"<<endl;
                cin>>x;
                Getdate(&L,x);
                break;
            case     5:
                cout<<"顺序表的长度为:"<<L.length<<endl;
                break;
            case     0:
                cout<<"退出!"<<endl;
                p=0;
                break;
            default :
                cout<<"输入有误,请在0~5之间输入!";
            }
        }
 
}

线性表的链式储存

定义:一组任意的存储单元储存线性表中数据的元素。

特点:(1)储存的数据的逻辑顺序和物理顺序不一定一致。

(2)查找第i元素必须从第一个到第i个。

代码:

#include <iostream>
using namespace std;
template<typename DataType>
struct Node
{
    DataType nums;
    float score;
    char name[30];
    Node<DataType> *next;
};
template<typename DataType>
class LinkList
{
    public:
    LinkList();
    void creatList(int n);
    ~LinkList();
    void printList();
    void insert();
    void delet();
    void lengths();
    void findvalue();
    void locate();
    private:
    Node<DataType> *head;

};
template<typename DataType>//无参构造,生成头节点
LinkList<DataType>::LinkList()
{
    head=new Node<DataType>;
    
}
template<typename DataType>//用于释放空间节点
LinkList<DataType>::~LinkList()
{
    while(head!=NULL)
    {
        Node<DataType> *p=head;
        head=head->next;
        delete p;
     } 
}
template<typename DataType>//构建单链表,用头插法
void LinkList<DataType>::creatList(int n)
{
    Node<DataType> *pre=head;
       int i=0;
    for(i=0;i<n;i++)
    {
        Node<DataType> *p=new Node<DataType>;
        cout<<"Please intput the NO."<<i+1<<' '<<"Student's nums,name and chore:" <<' ';
        cin>> p->nums >>p->name >>p->score ;
        pre->next =p;
        pre=p;
        p->next =NULL;        
    }
}
template<typename DataType>//打印单链表
void LinkList<DataType>::printList()
{
    Node<DataType> *p=head->next;
     while(p!=NULL)
    {
        cout<<p->nums<<' ' <<p->name<<' '<<p->score<<endl ;
        p=p->next ;
    }
}
template<typename DataType>//插入节点
void LinkList<DataType>::insert()
{
    Node<DataType> *p1,*p2;
    p1=head->next ;
    Node<DataType> *p0=new Node<DataType>;
    cout<<"Please input you will insert the data of Student:"<<' ';
    cin>>p0->nums>>p0->name>>p0->score;
    while((p0->nums >p1->nums) &&(p1->next !=NULL))
    {
        p2=p1;
        p1=p1->next ;
        
    }
    if(p0->nums <=p1->nums )
    {
        if(head->next==p1){
        head->next=p0;
        p0->next=p1;}
        else p2->next =p0;
        p0->next =p1;
        
    }
    else{
        p1->next =p0;p0->next =NULL;
    }
}
template<typename DataType>//删除节点
void LinkList<DataType>::delet()
{
    cout<<"Please intput the Student's nums that you will delete:"<<' ';
    int m;
    cin>>m;
    Node<DataType>*p1,*p2;
    p1=head;
    while(m!=p1->nums&&p1->next !=NULL)
{
    p2=p1;
    p1=p1->next ;
    }
    if(m==p1->nums )
{
    if(p1==head)head=p1->next ;
    else p2->next =p1->next ;

}
    else cout<<"the data is erro"<<endl;
}
template<typename DataType>//按值查找
void LinkList<DataType>::findvalue()
{
    int m;
    cout<<"Please intput the nums that you will find:"<<' ';
    cin>>m;
    Node<DataType>*p1=head;
    while(p1->nums!=m&&p1->next!=NULL)
    p1=p1->next;
    if(p1->next!=NULL)
    cout<<"This data's address is:"<<p1<<endl;
    else cout<<"This data is erro!"<<endl;
}
template<typename DataType>//按位查找
void LinkList<DataType>::locate()
{
    int K;
    cout<<"Please intput the serial number of the data you want to query:"<<' ';
    cin>>K;
    Node<DataType>*p=head;
    int i=1;
    while(i!=K&&p!=NULL)
    {
          p=p->next;
          i++;
    }
    if(i==K)
    cout<<"The digit of the data is:"<<' '<<p->nums<<' '<<p->name<<' '<<p->score<<endl;
    else cout<<"This data is erro"<<endl;

}
template<typename DataType>//计算表长
void LinkList<DataType>::lengths()
{
        int i=0;
    Node<DataType> *p=head->next ;
    while(p!=NULL)
    {
        i++;
        p=p->next ;
    }
    cout<<"Tis List of length is :"<<i<<endl;
}  
int main()
{
    LinkList<int>p;
    int n;
    cout<<"Please intput the number of Students:";
    cin>>n;
    p.creatList(n);
    p.printList();
    p.insert();
    cout<<"The new List is:"<<endl;
    p.printList();
    p.delet();
    cout<<"The new List is:"<<endl;
    p.printList();  
    p.findvalue();
    p.locate();
    p.lengths();
    return 0;    
}

总结:

线性表的2种储存方式,各有各的优点,首先是顺序表,最大的优点就是随机存取,节约空间,缺点是扩充困难,插入,删除需要大量移动数据;链表缺点是空间浪费较大,优点是插入,删除方便。

(声明:代码非本人所写,是网上搜的。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值