実験内容 1: ヘッダー ファイル Seqlist.h を作成し、ソース ファイル main.cpp の最後のジョブ コンテンツに注釈を付け、この main 関数を記述し、ヘッダー ファイルを呼び出して線形テーブル (x,x,x,x,x) を完成させます,x) 操作:
1. 空のテーブルを作成します。
2. シーケンステーブルbを作成し、結果を表示する
3. 4 番目の位置に 6 を挿入し、結果を表示します。
4. 位置 3 の値を削除し、結果を表示します。
5. 位置 5 の値は次のとおりです。
6. 線形テーブル内の値 4 の位置を見つけます。
7. シーケンス テーブルの長さは次のとおりです。
8. シーケンス テーブルが空かどうか:
実験内容2:
単一リンク リスト プログラム linklist.h を作成します (空のリストの作成、コンストラクター (先頭挿入または末尾挿入のいずれかを選択)、トラバーサル操作、長さ検索、ビットごとの検索、値検索、挿入、削除、デストラクターを含みます)。
ソースファイル main.cpp
#include <iostream>
#include "SeqList.h"
#include "LinkList.h"
int main()
{
cout<<"-----顺序表操作的实现-----"<<endl;
double b[]= {1,4,6,2,9,11,1};
SeqList<double> S;//创建对象
S.SeqList0(b);
cout<<"原始顺序表为:";
S.PrintList();
cout<<""<<endl;//换行
S.Insert(5,7);//插入
cout<<"在第5个位置插入7为:";
S.PrintList();
cout<<""<<endl;
S.Delete(3);//删除
cout<<"删除第3个位置元素为:";
S.PrintList();
cout<<""<<endl;
cout<<"按位查找,查找第6个元素值为:"<<S.get(6)<<endl;
cout<<"最大值为:"<<S.MAX()<<endl;
S.Sort();//排序
cout<<"从小到大排序为:";
S.PrintList();
S.Sort_reverse();
cout<<"从大到小排序为:";
S.PrintList();
cout<<""<<endl;
cout<<"-----链表操作的实现-----"<<endl;
LinkList<double> L;
L.LinkList0(b);
cout<<"链表的长度为"<<L.Length()<<endl;
cout<<"原始链表内具体内容:"<<endl;
L.PrintList();
cout<<"获取第3个结点的元素值:";
cout<<L.Get(3)<<endl;
cout<<"查找元素值为6的结点序号:";
cout<<L.Find_id(6)<<endl;
L.Insert(3,22);
cout<<"将22插入第3个结点:"<<endl;
L.PrintList();
L.Delete(5);
cout<<"删除第5个结点:"<<endl;
L.PrintList();
return 0;
}
ヘッダー ファイル LinkList.h
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
//链表头文件
template <typename T>
struct Node //定义节点
{
T data;//数据域
Node<T> *t;//指针域
};
template <typename T>
struct LinkList
{
void LinkList0(T a[]);//建立有元素的单链表
void PrintList();//打印链表数据域
T Get(int i);//按位查找,查找第i个结点的元素值
int Find_id(T x);//按值查找,查找值为x的元素序号
int Length();//输出链表的长度
void Insert(int i,T x);//插入操作,第i个位置插入值为x的结点
void Delete(int i);//删除操作,删除第i个结点
private:
int length;
Node<T> *first;//定义first数据类型指针,因为它是整个类的全局变量,会被多个方法使用,所以定义在这里
};
template <typename T>
void LinkList<T>::LinkList0(T a[])
{
int n;
for(int i=0; i<9999; i+=1)
{
if(a[i]<1e-300) break;//判断输入的值长度
else n+=1;
}
length=n;
first=new Node<T>;//创建头节点的指针,first有数据域与指针域,其自身代表数据域的地址
first->t=nullptr;//将头节点中指针域定义为空
for(int i=0;i<n;i+=1)
{
Node<T> *s=nullptr;//定义s的数据类型,为指针,并且赋予初值为空
s=new Node<T>;//创建一个节点的指针(地址)
s->data=a[i];//节点的数据域
s->t=first->t;//节点的指针域(代表下一个节点的地址)
first->t=s;//代表这一个节点i的地址,在下一个循环的时候,这个节点的地址会存到下一个节点的指针域,所以它是逆序创建
//cout<<(*s).data<<" "<<s->data<<" "<<s->t<<"\t";
}
}
template <typename T>
void LinkList<T>::PrintList()
{
Node<T> *p;//代表p是结点(地址)
p=first->t;//first代表头节点,first->t代表取头节点中指针域的内容,即下一个(第一个结点)的地址,即第一个结点地址给p
//所以可以理解为这里p代表第一个结点
//cout<<first->t<<" "<<p->t<<endl;
while(p!=nullptr)
{
cout<<p->data<<" "<<(*p).t<<"\t";//输出这个结点的信息,包括数据域与指针域
p=p->t;//将结点换成下一个结点
}
cout<<""<<endl;
cout<<"打印结束"<<endl;
}
template <typename T>
T LinkList<T>::Get(int i)
{
if(i>length) cout<<"get():超出结点长度"<<endl;
int count=1;//计数器。方便定位当前是第几个结点
Node<T> *p;
p=first->t;//这里p代表第一个结点
while(count!=i)//如果等于i就退出,这时p停到了第i个结点
{
p=p->t;//第动到下一个结点,如第一次循环,这里移动到了第二个结点,所以下面count加1,代表现在是第2个结点
count+=1;
}
return p->data;//放回第i个结点的元素值
}
template <typename T>
int LinkList<T>::Find_id(T x)
{
int count=1;//计数器,记录当前是第几个结点
Node<T> *p=first->t;//初始化p,让p代表第一个结点
while(p->data!=x&&p!=nullptr)//查看当前结点的元素是否等于要查找的元素,如果结点p为空,则说明最后一个结点查找完了也没有查找到
{
p=p->t;//含义与get()函数内注释一致
//当p为最后一个结点的时候,p->代表这个结点内元素值,p->t代表下一个结点的地址,为空,while先执行,所以最后一个结点先被查找了一遍
count+=1;
}
if(p==nullptr) cout<<"Find_id():未查找到元素"<<endl;
return count;
}
template <typename T>
int LinkList<T>::Length()
{
return length;
}
template <typename T>
void LinkList<T>::Insert(int i,T x)
{
int count=1;
Node<T> *p=first->t;//初始化结点,即代表p为第一个结点
Node<T> *s=nullptr;//定义一个结点s
while(p!=nullptr)//遍历链表
{
if(count==i-1)//i-1s'l
{
s=new Node<T>;s->data=x;//将我们要插入的元素值临时储存在s结点,s结点内数据域为x
s->t=p->t;//s结点内指针域为p->t,即第i个结点地址
p->t=s;//把第i-1个结点的指针域替换成s,相当于在第i-1与第i个结点之间插入s结点
length+=1;
break;
}
count+=1;
p=p->t;
}
}
template <typename T>
void LinkList<T>::Delete(int i)
{
if(i>length) cout<<"Delete():删除位置超过了链表长度"<<endl;
int count =1;
Node<T> *p=first->t,*s=nullptr;
while(p!=nullptr)
{
if(count==i-1)
{
s=p->t;//将第i个结点赋值给s结点,即s结点代表第i个结点
p->t=s->t;//s->t代表第i+1个结点,p->t代表第i-1个结点的指针域,即将第i-1个结点的指针域改为指向第i+1个结点
//这样相当于完成删除第i个结点
length-=1;
break;
}
count+=1;
p=p->t;
}
}
#endif // LINKLIST_H_INCLUDED
ヘッダファイルSeqList.h
#ifndef SEQLIST_H_INCLUDED
#define SEQLIST_H_INCLUDED
//顺序表头文件
using namespace std;
const int Maxsize=100;//顺序表最大长度
template <typename T>
struct SeqList
{
void SeqList0(T a[]);//创建长度为n的顺序表
int Length();//返回数组长度
T get(int i);//按位查找,查找第i个元素值
T Find(T x);//按值查找,查找值为x的元素序号,返回-1代表未查找到
void Insert(int i,T x);//插入操作,在第i个位置插入值为x的元素
void Delete(int i);//删除操作,删除第i个元素
void PrintList();//按序号依次输出各元素
T MAX();//取表中最大的
T MIN();//取表中最小的
void Sort();//从小到大排序
void Sort_reverse();//从大到小排序
private:
T data[Maxsize];
int length=0;
};
template <typename T>
void SeqList<T>::SeqList0(T a[])
{
for(int i=0; i<Maxsize; i+=1)
{
if(a[i]<1e-300) break;//判断输入的值长度
else length+=1;
}
if(length==Maxsize) cout<<"SeqList0():警告建议扩大表最大长度"<<endl;
for(int i=0; i<length; i+=1)
{
data[i]=a[i];
}
}
template <typename T>
int SeqList<T>::Length()
{
return length;
}
template <typename T>
T SeqList<T>::get(int i)
{
if (i<1||i>length) cout<<"get():超出表长度"<<endl;
return data[i-1];
}
template <typename T>
T SeqList<T>::Find(T x)
{
for(int i=0; i<length; i+=1)
{
if(data[i]==x)
{
return i+1;
break;
}
else if(i==length-1)//最后一个循环完了都没有执行break,说明没查找到
{
return -1;
}
}
}
template <typename T>
void SeqList<T>::Insert(int i,T x)
{
if(length==Maxsize) cout<<"Insert():溢出"<<endl;
if(i<1||i>length+1) cout<<"Insert():插入位置错误"<<endl;
for(int j=length-1; j>=i-1; j=j-1)
{
data[j+1]=data[j];//从最后的元素开始往后移,到要插入的地方停止
}
data[i-1]=x;
length+=1;//更新表的长度
}
template <typename T>
void SeqList<T>::Delete(int i)
{
if(i<1||i>length) cout<<"Delete():删除的位置不存在"<<endl;
for(int j=i-1; j<length; j+=1)
{
data[j]=data[j+1];//删除之后,后面的数整体向前移
}
length-=1;
}
template <typename T>
void SeqList<T>::PrintList()
{
for(int i=1; i<=length; i+=1)
{
cout<<get(i)<<" ";
}
}
template <typename T>
T SeqList<T>::MAX()
{
double z=data[0];
for(int i=0; i<length; i+=1)
{
if(data[i]>z) z=data[i];
}
return z;
}
template <typename T>
T SeqList<T>::MIN()
{
double z=data[0];
for(int i=0; i<length; i+=1)
{
if(data[i]<z) z=data[i];
}
return z;
}
template <typename T>
void SeqList<T>::Sort()
{
int a=999;//主要为了while能开始循环
while(a!=0)
{
a=0;
for(int i=0; i<length-1; i+=1)
{
if(data[i]>data[i+1])
{
double x=data[i];
data[i]=data[i+1];
data[i+1]=x;//冒泡排序
a=a+1;//判断是否执行了if这个语句,没有执行则说明完成排序的,同时a值不会被改变恒为0,从而退出while循环
}
}
}
}
template <typename T>
void SeqList<T>::Sort_reverse()
{
double a=999;//目的主要是为了让while能开始循环
while(a!=0)
{
a=0;
for(int i=0; i<length-1; i+=1) //length是代表数组长度
{
if(data[i]<data[i+1])
{
//交换位置
T x=data[i];
data[i]=data[i+1];
data[i+1]=x;
a+=1;
}
}
}
}
#endif // SEQLIST_H_INCLUDED
操作結果:
-----順序表操作の実装-----
元の順序表は 1 4 6 2 9 11 1
5 番目の位置に 7 を挿入すると 1 4 6 2 7 9 11 1
3 番目の要素を削除します位置は: 1 4 2 7 9 11 1.
ビット単位で検索します。6 番目の要素の値は: 11.
最大値は: 11.
小さいものから大きいものへの並べ替えは次のとおりです: 1 1 2 4 7 9 11. からの並べ替え大から小まで: 11 9 7 4 2 1 1
-----リンク リスト操作の実装-----
リンク リストの長さは 7 です。
元のリンク リストの具体的な内容:
1 0xf61a30 11 0xf61a10 9 0xf619f0 2 0xf619d0 6 0xf619b0 4 0xf61660 1 0 3 番目の結果は
印刷後に要素値 6 を持つノード番号を見つけます。5 3 番目のノードに 22 を挿入します: 1 0xf61a30 11 0xf61a70 22 0xf61a1 0 9 0xf619f0 2 0xf619d0 6 0xf619b0 4 0xf61660 1 0印刷の終了と 5 番目のノードの削除: 1 0xf61a30 11 0xf61a70 22 0xf61a10 9 0xf619d0 6 0xf619b0 4 0xf61660 1 0終了印刷の
プロセスは 0 (0x0) を返しました。 実行時間 : 0.030 秒
続行するには任意のキーを押してください。