断点调试
由于在开发程序的过程中会出现一些报错,这个时候我们就可以用断点调试,一步一步的看源代码执行过程中,发现代码的错误所在。一般都是在某一行设置一个断点,调试时,程序运行到这一行就会停止,然后就可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码即可,然后进行找到和分析处理这个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种储存方式,各有各的优点,首先是顺序表,最大的优点就是随机存取,节约空间,缺点是扩充困难,插入,删除需要大量移动数据;链表缺点是空间浪费较大,优点是插入,删除方便。
(声明:代码非本人所写,是网上搜的。)