数据结构实验报告

数据结构实验报告

实验一

1、编写算法实现线性顺序表的逆置。

2、用线性表的链式模式编写算法,实现两个表La=(1,5,4,8,6,11)和Lb=(9,7,4,2,1,5)的并集。

实验1-1

主要代码:

bool GetElem(int position, int &e) const // 求指定位置的元素 {

if (position count)

return false;

else

{

e=elems[position-1];

return true;

}

}

bool SetElem(int position, const int &e) // 设置指定位置的元素值 {

if (position count)

return false;

else

{

elems[position-1]=e;

return true;

}

}

void disp()

{

for (int i=0; i

{

cout

}

cout

}

};

void reverse(SqList &la)

{

int leftposition=1;

int rightposition=la.Length();

int a,b;

while(leftposition

{la.GetElem(leftposition,a);

la.GetElem(rightposition,b);

la.SetElem(leftposition,b);

la.SetElem(rightposition,a);

leftposition++;

rightposition--;

} //在这里加代码

}

int main()

{

int a[10]= {1,2,3,4,5,6,7,8,9,10};

SqList la(a,10);

la.disp();

reverse(la); //该函数完成逆置功能

la.disp();

return 0;

}

int *p,*q;

int position=0;

bool flag=false;

p=head;

p=p->next;

while(p!=null)

{position++;

if (position>=2&&p->data==x)

{q=GetElemPtr(position-2);

*tmpPtr=q->next;

}

q->next=tmpPt->next;

delete tmpPtr;

flag=true;

position--;}

p=p->next;

}//这里加代码

return flag;

实验1-2

主要代码:

SimpleLinkList::SimpleLinkList(const SimpleLinkList &copy)

// 操作结果:由线性表copy 构造新线性表——复制构造函数模板

{

int copyLength = copy.Length(); // copy的长度

int e;

Init(); // 初始化线性表

for (int curPosition = 1; curPosition

bool SimpleLinkList::Delete_x(int &x)

{

Node *p,*q;

int position=0;

p=head;

p=p->next;

while(p!=NULL)

{

position++;

if (position>=2&&p->data==x)

{

q=GetElemPtr(position-2);

Node *tmpPtr=q->next;

q->next=tmpPtr->next;

delete tmpPtr;

position--;

}

p=p->next;

}

return true;//这里加代码

}

int main()

{

int a[9]= {1,5,4,8,6,11,11,11,56};

SimpleLinkList la(a,9);

la.Traverse();

la.Delete_x(a[5]);

//这里完成删除x 的前一个节点操作

la.Traverse();

}

实验二

1、已知q 是一个非空顺序队列,s 是一个顺序栈,请设计一个算法,实现将队列q 中所有元素逆置。

2、请完成队列划分子集问题的算法。

实验2-1

主要代码:

void SqQueue::Traverse() const

// 操作结果:依次对队列的每个元素调用函数(*visit)

{

for (int curPosition = front; curPosition != rear;

curPosition = (curPosition + 1) % maxSize)

{ // 对队列每个元素调用函数(*visit)

cout

}

cout

}

bool SqQueue::OutQueue(int &e)

// 操作结果:如果队列非空,那么删除队头元素,并用e 返回其值,返回SUCCESS, // 否则返回UNDER_FLOW,

{

if (!Empty())

{ // 队列非空

e = elems[front]; // 用e 返回队头元素

front = (front + 1) % maxSize; // front指向下一元素 return true;

}

else

{ // 队列为空

return false;

}

}

bool SqQueue::GetHead(int &e) const

// 操作结果:如果队列非空,那么用e 返回队头元素,返回SUCCESS, // 否则返回UNDER_FLOW,

{

if (!Empty())

{ // 队列非空

e = elems[front]; // 用e 返回队头元素

return true;

}

else

{ // 队列为空

return false;

}

}

bool SqQueue::InQueue(const int &e)

// 操作结果:如果队列已满,返回OVER_FLOW,

// 否则插入元素e 为新的队尾,返回SUCCESS

{

if (Full())

{ // 队列已满

return false;

}

else

{ // 队列未满,入队成功

elems[rear] = e; // 插入e 为新队尾

rear = (rear + 1) % maxSize; // rear指向新队尾 return true;

}

}

int main()

{

int a[10]={1,2,3,4,5,6,7,8,9,10};

int i,temp,n=10;

SqQueue q(n+1);

SqStack s(n+1);

for (i=0;i

q.InQueue(a[i]);

cout

q.Traverse();

for (i=0;i

{

q.OutQueue(temp);

s.Push(temp);

}

cout

s.Traverse();

for (i=0;i

{

s.Pop(temp);

q.InQueue(temp);

}

cout

q.Traverse();

return 0;

}

实验2-2

主要代码:

bool SqQueue::OutQueue(int &e)

// 操作结果:如果队列非空,那么删除队头元素,并用e 返回其值,返回SUCCESS, // 否则返回UNDER_FLOW,

{

if (!Empty())

{

// 队列非空

e = elems[front]; // 用e 返回队头元素 front = (front + 1) % maxSize; // front指向下一元素 return true;

}

else

{

// 队列为空

return false;

}

}

bool SqQueue::InQueue(const int &e)

// 操作结果:如果队列已满,返回OVER_FLOW,

// 否则插入元素e 为新的队尾,返回SUCCESS

{

if (Full())

{

// 队列已满

return false;

}

else

{

// 队列未满,入队成功

elems[rear] = e; // 插入e 为新队尾

rear = (rear + 1) % maxSize; // rear指向新队尾 return true;

}

}

int main()

{

int A[9]= {1,2,3,4,5,6,7,8,9};

int R[9][9],n=9,a,b,i,j,temp,group,num_all,num_group;

int result[n],newr[n];

SqQueue q(n+1);

for (i=0; i

{

result[i]=0;

for (j=0; j

{

R[i][j]=0;

}

}

for (i=0; i

q.InQueue(A[i]);

cout>a,a!=-1) //完成关系矩阵的赋值操作

{

cin>>b;

R[a-1][b-1]=1;

R[b-1][a-1]=1;

}

group=0;

num_all=n;

num_group=0;

while(!q.Empty()) //只要循环队列中元素不为空,就做如下的划分操作 {

group++;//第group 组的元素划分

q.OutQueue(temp); //该组第一个元素出栈

num_group++; //该组目前具有的数量

result[temp-1]=group;//该组元素对应的位置放到result 中

for (i=0; i

newr[i]=R[temp-1][i]; //把与该元素的冲突关系记录到数组

newr 中

num_all=num_all-num_group; //还需要出队列判断的元素数量 num_group=0; //初始化

for (j=0; j

{

q.OutQueue(temp);

if (newr[temp-1]==1) //如果该元素与当前的组的元素有冲突,重新入队

q.InQueue(temp);

else //否则把该元素加入到当前组中 {

result[temp-1]=group;

for (i=0; i

{

if (R[temp-1][i]==1) //把鱼当前元素有冲突的冲突关系加入到数组newr 中

newr[i]=1;

}

num_group++; //该组目前具有的元素数量

}

}

}

for (i=1; i

{

cout

for (j=0; j

{

if (result[j]==i)

cout

}

cout

}

return 0;

}

实验三

1、系数矩阵的快速转置,并输出转置之后的矩阵

2、二叉树的遍历,分别调用先序,中序和后序遍历算法输出遍历结果。

实验3-1

主要代码:

void TriSparseMatrix::FastTranspose(const TriSparseMatrix &source, TriSparseMatrix &dest)

// 操作结果:将稀疏矩阵source 转置成稀疏矩阵dest 的快速算法 {

dest.rows=source.cols;

dest.cols=source.rows;

dest.num=source.num;

dest.maxSize=source.maxSize;

delete []dest.triElems;

dest.triElems=new

Triple[dest.maxSize];

if(dest.num>0)

{

int destPos=0;

for(int col=1;col

{

for(int sourcePos=0;sourcePos

if(source.triElems[sourcePos].col==col) {

dest.triElems[destPos].row=source.triElems[sourcePos].col;

dest.triElems[destPos].col=source.triElems[sourcePos].row;

dest.triElems[destPos].value=source.triElems[sourcePos].value; destPos++;

}

}

}

}

//代码写在这里

// 释放cPos

}

int main(void)

{

const int n = 5;

TriSparseMatrix a(n, n); // 定义一个n 行n 列稀疏矩阵 int b[n][n] =

{

1, 0, 3, 0, 0,

4, 0, 6, 0, 0,

0, 0, 8, 9, 0,

0, 0, 0, 1, 12,

1, 0, 0, 3, 1

};

int i, j, v; // 工作变量

// 设置稀疏矩阵a 的元素值

for (i = 1; i

{

// 行

for (j = 1; j

{

// 列

a.SetElem(i, j, b[i - 1][j - 1]); // 设置元素值 }

}

// 显示转置前的稀疏矩阵a

cout

for (i = 1; i

{

// 行

for (j = 1; j

{

// 列

a.GetElem(i, j, v); // 求元素值

cout

}

cout

}

TriSparseMatrix c;

TriSparseMatrix::FastTranspose(a, c);// 转置a 成c

// 显示转置后稀疏矩阵c

cout

for (i = 1; i

{

// 行

for (j = 1; j

{

// 列

c.GetElem(i, j, v); // 求元素值

cout

}

cout

}

return 0; // 返回值0, 返回操作系统

}

实验3-2

主要代码:

void BinaryTree::InOrderHelp(BinTreeNode *r) const

// 操作结果:中序遍历以r 为根的二叉树

{

if(r!= NULL)

{

InOrderHelp(r->leftChild);

coutdata);

InOrderHelp(r->rightChild);

} //代码写在这里

}

void BinaryTree::InOrder() const

// 操作结果:中序遍历二叉树

{

InOrderHelp(root);

}

void BinaryTree::PostOrderHelp(BinTreeNode *r) const

// 操作结果:后序遍历以r 为根的二叉树

{

if(r!= NULL)

{PostOrderHelp(r->leftChild);

PostOrderHelp(r->rightChild);

coutdata);

}//代码写在这里

}

实验四

1、分别用普通查找和折半查找在数组中查找一个数字,输出其数组的下标和比较的次数。

2、散列表的构建与查找已知一组关键字

(19,14,23,1,68,20,84,27,55,11,10,79)

哈希函数为:H(key)=key MOD 13, 哈希表长为m=16,利用线性探索法构建散列表,并根据每个输入的key 值输出其位置下标和比较的次数。

实验4-1

主要代码:

#include

using namespace std;

bool sqSearch(int a[], int n, int key, int &loc, int &count) //顺序查找函数:数组为a ;n 为数组中元素个数;key 为查找的数据,loc 为数据对应的位置;count 为比较的次数;查找成功返回true ,否则返回false. {

//代码内容

int i;

for (i=0;i

{

if (a[i]==key)

{

loc=i;

count=i+1;

return true;

}

}

return false;

}

bool BinSearch(int a[],int n,int key, int &loc, int &count) //折半查找函数:数组为a;n 为数组中元素个数;key 为查找的数据,loc 为数据对应的位置;count 为比较的次数; 查找成功返回true ,否则返回false.

{

//代码内容

int cou,mid,low,high;

cou=0;

low=0;

high=n-1;

while (low

{

mid=(low+high)/2;

cou=cou+1;

cout

if (a[mid]==key)

{

count=cou;

loc=mid;

return true;

}

else

if (key

high=mid-1;

else

low=mid+1;

}

return false;

}

int main()

{

int

num[19]={3,4,9,11,12,13,16,22,23,24,29,30,38,66,87,91,93,95,99}; int loc,count,n=19,key=91;

if (sqSearch(num,n,key,loc,count)==true)

{

cout

cout

cout

}

if (BinSearch(num,n,key,loc,count)==true)

{

cout

cout

cout

}

return 0;

}

实验4-2

主要代码:

#include

using namespace std;

void Hconstruct(int a[],int n,int c[],int p, int m)

{

int i,te;

int *temp=new int[m];

for (i=0; i

{

temp[i]=0;

}

for (i=0; i

{

te=a[i]%p;

if (temp[te]==0)

{

c[te]=a[i];

temp[te]=1;

}

else

{while (temp[te]==1)

{

te=(te+1)%m;

}

c[te]=a[i];

temp[te]=1;

}

}

}

void Hsearch(int key,int c[],int p,int m,int &loc,int &time) {

int temp;

time=1;

temp=key%p;

while(c[temp]!=key)

{

temp=(temp+1)%m;

time++;

loc=temp;

}

int main()

{

int a[12]={19,14,23,1,68,20,84,27,55,11,10,79};

int c[16];

int loc,time,key,p,m;

p=13;

m=16;

Hconstruct(a,12,c,p,m);

while(cin>>key,key!=-1)

{

Hsearch(key,c,p,m,loc,time);

cout

}

return 0;

}

实验五

1、对于100个无序的整数,分别使用冒泡排序、快速排序和希尔排序使其有序。

2、假设有100个红白蓝三种颜色的小色块(无序:三种颜色分别用0,1,2表示) ,编写程序,使每种颜色有序排列(注意:要求时间复杂度为O(n)).

实验5-1

主要代码:

#include

#include

#include

using namespace std;

//数据交换函数

void Swap(int &a, int &b)

{

int temp;

temp=a;

a=b;

b=temp;

}

//冒泡排序

void BubbleSort(int elem[], int n)

{

int flag, low=0, high=n-1 , i;

while (low

{

flag=0;

for (i= low; i

if (elem[i] > elem[i + 1])

{

Swap(elem[i], elem[i + 1]);

flag=1;

}

if(!flag) break;

high--;

for(i=high; i>low; i--) //反向冒泡

if( elem[i]

{

Swap(elem[i], elem[i-1]);

}

low ++;

}

}

//快速排序的一次划分

int Partition(int elem[], int low, int high)

{

while (low

{

while (low = elem[low])

{

high--;

}

Swap(elem[low], elem[high]);

while (low

{

low++;

}

Swap(elem[low], elem[high]);

}

return low;

}

//快速排序

void QuickSort(int elem[], int low, int high)

{

if (low

{

int pivotLoc=Partition(elem, low, high);

QuickSort(elem, low, pivotLoc-1);

QuickSort(elem, pivotLoc+1, high);

}

}

//希尔排序

void ShellInsert(int elem[],int n,int incr)

{

for (int i=incr;i

{

int e=elem[i];

int j;

for (j=i-incr;j>=0 && e

{

elem[j+incr]=elem[j];

}

elem[j+incr]=e;

}

}

void ShellSort(int elem[],int n, int inc[],int t)

{

for (int k=0;k

{

ShellInsert(elem,n,inc[k]);

}

}

int main()

{

int a[101],data[101],shelldata[101],n=100,i;

cout

srand((unsigned)time(NULL));

for (i=0; i

{

a[i]=rand()%1000;

data[i]=a[i];

shelldata[i]=a[i];

coutif ((i+1)%10==0)

{

cout

}

}

BubbleSort(a,n);

cout

for (i=0; i

{

coutif ((i+1)%10==0)

{

cout

}

}

QuickSort(data,0,n-1);

cout

for (i=0; i

{

cout

if ((i+1)%10==0)

{

cout

}

}

int incr[]={50,25,12,6,3,1};

int t=6;

ShellSort(shelldata,n,incr,t);

cout

for (i=0; i

{

cout

if ((i+1)%10==0)

{

cout

}

}

return 0;

}

实验5-2

主要代码:

#include

#include

using namespace std;

#define N 100

void swap (int &var1, int &var2)

{

int temp = var1;

var1 = var2;

var2 = temp;

}

void shuffle(int *array)

{

int current = 0;

int end = N-1;

int begin = 0;

while( current

{

if( array[current] ==0 )

{

swap(array[current],array[begin]);

current++;

begin++;

}

else if( array[current] == 1 )

{

current++;

}

else{//if array[current] =2

swap(array[current],array[end]);

end--;

}

}

}

int main()

{

int a[N];

int i;

cout

for( i=0 ; i

{

a[i] = rand()%3;

cout

}

cout

cout

shuffle(a);

for(i=0 ; i

{

cout

}

cout

return 0;

}

实验心得

数据结构是一门设计数据的结构的学科,要把书本上学到的东西运用到实践中去并不简单,我刚开始自己运用学到的知识去编程的时候有些不知所措,有些东西不能理解,这对初学者来说确实很难,又拿起课本仔细的研究了一下,询问了老师和同学才搞懂了一些东西,自己的程序才能顺利运行。

通过这门课程和这些实验让我逐渐了解了数据结构这门学科,也渐渐对编程加强了兴趣,总之学到了很多也得到了很多,感谢同学和老师对我的帮助和鼓励。

数据结构实验报告

实验一

1、编写算法实现线性顺序表的逆置。

2、用线性表的链式模式编写算法,实现两个表La=(1,5,4,8,6,11)和Lb=(9,7,4,2,1,5)的并集。

实验1-1

主要代码:

bool GetElem(int position, int &e) const // 求指定位置的元素 {

if (position count)

return false;

else

{

e=elems[position-1];

return true;

}

}

bool SetElem(int position, const int &e) // 设置指定位置的元素值 {

if (position count)

return false;

else

{

elems[position-1]=e;

return true;

}

}

void disp()

{

for (int i=0; i

{

cout

}

cout

}

};

void reverse(SqList &la)

{

int leftposition=1;

int rightposition=la.Length();

int a,b;

while(leftposition

{la.GetElem(leftposition,a);

la.GetElem(rightposition,b);

la.SetElem(leftposition,b);

la.SetElem(rightposition,a);

leftposition++;

rightposition--;

} //在这里加代码

}

int main()

{

int a[10]= {1,2,3,4,5,6,7,8,9,10};

SqList la(a,10);

la.disp();

reverse(la); //该函数完成逆置功能

la.disp();

return 0;

}

int *p,*q;

int position=0;

bool flag=false;

p=head;

p=p->next;

while(p!=null)

{position++;

if (position>=2&&p->data==x)

{q=GetElemPtr(position-2);

*tmpPtr=q->next;

}

q->next=tmpPt->next;

delete tmpPtr;

flag=true;

position--;}

p=p->next;

}//这里加代码

return flag;

实验1-2

主要代码:

SimpleLinkList::SimpleLinkList(const SimpleLinkList &copy)

// 操作结果:由线性表copy 构造新线性表——复制构造函数模板

{

int copyLength = copy.Length(); // copy的长度

int e;

Init(); // 初始化线性表

for (int curPosition = 1; curPosition

bool SimpleLinkList::Delete_x(int &x)

{

Node *p,*q;

int position=0;

p=head;

p=p->next;

while(p!=NULL)

{

position++;

if (position>=2&&p->data==x)

{

q=GetElemPtr(position-2);

Node *tmpPtr=q->next;

q->next=tmpPtr->next;

delete tmpPtr;

position--;

}

p=p->next;

}

return true;//这里加代码

}

int main()

{

int a[9]= {1,5,4,8,6,11,11,11,56};

SimpleLinkList la(a,9);

la.Traverse();

la.Delete_x(a[5]);

//这里完成删除x 的前一个节点操作

la.Traverse();

}

实验二

1、已知q 是一个非空顺序队列,s 是一个顺序栈,请设计一个算法,实现将队列q 中所有元素逆置。

2、请完成队列划分子集问题的算法。

实验2-1

主要代码:

void SqQueue::Traverse() const

// 操作结果:依次对队列的每个元素调用函数(*visit)

{

for (int curPosition = front; curPosition != rear;

curPosition = (curPosition + 1) % maxSize)

{ // 对队列每个元素调用函数(*visit)

cout

}

cout

}

bool SqQueue::OutQueue(int &e)

// 操作结果:如果队列非空,那么删除队头元素,并用e 返回其值,返回SUCCESS, // 否则返回UNDER_FLOW,

{

if (!Empty())

{ // 队列非空

e = elems[front]; // 用e 返回队头元素

front = (front + 1) % maxSize; // front指向下一元素 return true;

}

else

{ // 队列为空

return false;

}

}

bool SqQueue::GetHead(int &e) const

// 操作结果:如果队列非空,那么用e 返回队头元素,返回SUCCESS, // 否则返回UNDER_FLOW,

{

if (!Empty())

{ // 队列非空

e = elems[front]; // 用e 返回队头元素

return true;

}

else

{ // 队列为空

return false;

}

}

bool SqQueue::InQueue(const int &e)

// 操作结果:如果队列已满,返回OVER_FLOW,

// 否则插入元素e 为新的队尾,返回SUCCESS

{

if (Full())

{ // 队列已满

return false;

}

else

{ // 队列未满,入队成功

elems[rear] = e; // 插入e 为新队尾

rear = (rear + 1) % maxSize; // rear指向新队尾 return true;

}

}

int main()

{

int a[10]={1,2,3,4,5,6,7,8,9,10};

int i,temp,n=10;

SqQueue q(n+1);

SqStack s(n+1);

for (i=0;i

q.InQueue(a[i]);

cout

q.Traverse();

for (i=0;i

{

q.OutQueue(temp);

s.Push(temp);

}

cout

s.Traverse();

for (i=0;i

{

s.Pop(temp);

q.InQueue(temp);

}

cout

q.Traverse();

return 0;

}

实验2-2

主要代码:

bool SqQueue::OutQueue(int &e)

// 操作结果:如果队列非空,那么删除队头元素,并用e 返回其值,返回SUCCESS, // 否则返回UNDER_FLOW,

{

if (!Empty())

{

// 队列非空

e = elems[front]; // 用e 返回队头元素 front = (front + 1) % maxSize; // front指向下一元素 return true;

}

else

{

// 队列为空

return false;

}

}

bool SqQueue::InQueue(const int &e)

// 操作结果:如果队列已满,返回OVER_FLOW,

// 否则插入元素e 为新的队尾,返回SUCCESS

{

if (Full())

{

// 队列已满

return false;

}

else

{

// 队列未满,入队成功

elems[rear] = e; // 插入e 为新队尾

rear = (rear + 1) % maxSize; // rear指向新队尾 return true;

}

}

int main()

{

int A[9]= {1,2,3,4,5,6,7,8,9};

int R[9][9],n=9,a,b,i,j,temp,group,num_all,num_group;

int result[n],newr[n];

SqQueue q(n+1);

for (i=0; i

{

result[i]=0;

for (j=0; j

{

R[i][j]=0;

}

}

for (i=0; i

q.InQueue(A[i]);

cout>a,a!=-1) //完成关系矩阵的赋值操作

{

cin>>b;

R[a-1][b-1]=1;

R[b-1][a-1]=1;

}

group=0;

num_all=n;

num_group=0;

while(!q.Empty()) //只要循环队列中元素不为空,就做如下的划分操作 {

group++;//第group 组的元素划分

q.OutQueue(temp); //该组第一个元素出栈

num_group++; //该组目前具有的数量

result[temp-1]=group;//该组元素对应的位置放到result 中

for (i=0; i

newr[i]=R[temp-1][i]; //把与该元素的冲突关系记录到数组

newr 中

num_all=num_all-num_group; //还需要出队列判断的元素数量 num_group=0; //初始化

for (j=0; j

{

q.OutQueue(temp);

if (newr[temp-1]==1) //如果该元素与当前的组的元素有冲突,重新入队

q.InQueue(temp);

else //否则把该元素加入到当前组中 {

result[temp-1]=group;

for (i=0; i

{

if (R[temp-1][i]==1) //把鱼当前元素有冲突的冲突关系加入到数组newr 中

newr[i]=1;

}

num_group++; //该组目前具有的元素数量

}

}

}

for (i=1; i

{

cout

for (j=0; j

{

if (result[j]==i)

cout

}

cout

}

return 0;

}

实验三

1、系数矩阵的快速转置,并输出转置之后的矩阵

2、二叉树的遍历,分别调用先序,中序和后序遍历算法输出遍历结果。

实验3-1

主要代码:

void TriSparseMatrix::FastTranspose(const TriSparseMatrix &source, TriSparseMatrix &dest)

// 操作结果:将稀疏矩阵source 转置成稀疏矩阵dest 的快速算法 {

dest.rows=source.cols;

dest.cols=source.rows;

dest.num=source.num;

dest.maxSize=source.maxSize;

delete []dest.triElems;

dest.triElems=new

Triple[dest.maxSize];

if(dest.num>0)

{

int destPos=0;

for(int col=1;col

{

for(int sourcePos=0;sourcePos

if(source.triElems[sourcePos].col==col) {

dest.triElems[destPos].row=source.triElems[sourcePos].col;

dest.triElems[destPos].col=source.triElems[sourcePos].row;

dest.triElems[destPos].value=source.triElems[sourcePos].value; destPos++;

}

}

}

}

//代码写在这里

// 释放cPos

}

int main(void)

{

const int n = 5;

TriSparseMatrix a(n, n); // 定义一个n 行n 列稀疏矩阵 int b[n][n] =

{

1, 0, 3, 0, 0,

4, 0, 6, 0, 0,

0, 0, 8, 9, 0,

0, 0, 0, 1, 12,

1, 0, 0, 3, 1

};

int i, j, v; // 工作变量

// 设置稀疏矩阵a 的元素值

for (i = 1; i

{

// 行

for (j = 1; j

{

// 列

a.SetElem(i, j, b[i - 1][j - 1]); // 设置元素值 }

}

// 显示转置前的稀疏矩阵a

cout

for (i = 1; i

{

// 行

for (j = 1; j

{

// 列

a.GetElem(i, j, v); // 求元素值

cout

}

cout

}

TriSparseMatrix c;

TriSparseMatrix::FastTranspose(a, c);// 转置a 成c

// 显示转置后稀疏矩阵c

cout

for (i = 1; i

{

// 行

for (j = 1; j

{

// 列

c.GetElem(i, j, v); // 求元素值

cout

}

cout

}

return 0; // 返回值0, 返回操作系统

}

实验3-2

主要代码:

void BinaryTree::InOrderHelp(BinTreeNode *r) const

// 操作结果:中序遍历以r 为根的二叉树

{

if(r!= NULL)

{

InOrderHelp(r->leftChild);

coutdata);

InOrderHelp(r->rightChild);

} //代码写在这里

}

void BinaryTree::InOrder() const

// 操作结果:中序遍历二叉树

{

InOrderHelp(root);

}

void BinaryTree::PostOrderHelp(BinTreeNode *r) const

// 操作结果:后序遍历以r 为根的二叉树

{

if(r!= NULL)

{PostOrderHelp(r->leftChild);

PostOrderHelp(r->rightChild);

coutdata);

}//代码写在这里

}

实验四

1、分别用普通查找和折半查找在数组中查找一个数字,输出其数组的下标和比较的次数。

2、散列表的构建与查找已知一组关键字

(19,14,23,1,68,20,84,27,55,11,10,79)

哈希函数为:H(key)=key MOD 13, 哈希表长为m=16,利用线性探索法构建散列表,并根据每个输入的key 值输出其位置下标和比较的次数。

实验4-1

主要代码:

#include

using namespace std;

bool sqSearch(int a[], int n, int key, int &loc, int &count) //顺序查找函数:数组为a ;n 为数组中元素个数;key 为查找的数据,loc 为数据对应的位置;count 为比较的次数;查找成功返回true ,否则返回false. {

//代码内容

int i;

for (i=0;i

{

if (a[i]==key)

{

loc=i;

count=i+1;

return true;

}

}

return false;

}

bool BinSearch(int a[],int n,int key, int &loc, int &count) //折半查找函数:数组为a;n 为数组中元素个数;key 为查找的数据,loc 为数据对应的位置;count 为比较的次数; 查找成功返回true ,否则返回false.

{

//代码内容

int cou,mid,low,high;

cou=0;

low=0;

high=n-1;

while (low

{

mid=(low+high)/2;

cou=cou+1;

cout

if (a[mid]==key)

{

count=cou;

loc=mid;

return true;

}

else

if (key

high=mid-1;

else

low=mid+1;

}

return false;

}

int main()

{

int

num[19]={3,4,9,11,12,13,16,22,23,24,29,30,38,66,87,91,93,95,99}; int loc,count,n=19,key=91;

if (sqSearch(num,n,key,loc,count)==true)

{

cout

cout

cout

}

if (BinSearch(num,n,key,loc,count)==true)

{

cout

cout

cout

}

return 0;

}

实验4-2

主要代码:

#include

using namespace std;

void Hconstruct(int a[],int n,int c[],int p, int m)

{

int i,te;

int *temp=new int[m];

for (i=0; i

{

temp[i]=0;

}

for (i=0; i

{

te=a[i]%p;

if (temp[te]==0)

{

c[te]=a[i];

temp[te]=1;

}

else

{while (temp[te]==1)

{

te=(te+1)%m;

}

c[te]=a[i];

temp[te]=1;

}

}

}

void Hsearch(int key,int c[],int p,int m,int &loc,int &time) {

int temp;

time=1;

temp=key%p;

while(c[temp]!=key)

{

temp=(temp+1)%m;

time++;

loc=temp;

}

int main()

{

int a[12]={19,14,23,1,68,20,84,27,55,11,10,79};

int c[16];

int loc,time,key,p,m;

p=13;

m=16;

Hconstruct(a,12,c,p,m);

while(cin>>key,key!=-1)

{

Hsearch(key,c,p,m,loc,time);

cout

}

return 0;

}

实验五

1、对于100个无序的整数,分别使用冒泡排序、快速排序和希尔排序使其有序。

2、假设有100个红白蓝三种颜色的小色块(无序:三种颜色分别用0,1,2表示) ,编写程序,使每种颜色有序排列(注意:要求时间复杂度为O(n)).

实验5-1

主要代码:

#include

#include

#include

using namespace std;

//数据交换函数

void Swap(int &a, int &b)

{

int temp;

temp=a;

a=b;

b=temp;

}

//冒泡排序

void BubbleSort(int elem[], int n)

{

int flag, low=0, high=n-1 , i;

while (low

{

flag=0;

for (i= low; i

if (elem[i] > elem[i + 1])

{

Swap(elem[i], elem[i + 1]);

flag=1;

}

if(!flag) break;

high--;

for(i=high; i>low; i--) //反向冒泡

if( elem[i]

{

Swap(elem[i], elem[i-1]);

}

low ++;

}

}

//快速排序的一次划分

int Partition(int elem[], int low, int high)

{

while (low

{

while (low = elem[low])

{

high--;

}

Swap(elem[low], elem[high]);

while (low

{

low++;

}

Swap(elem[low], elem[high]);

}

return low;

}

//快速排序

void QuickSort(int elem[], int low, int high)

{

if (low

{

int pivotLoc=Partition(elem, low, high);

QuickSort(elem, low, pivotLoc-1);

QuickSort(elem, pivotLoc+1, high);

}

}

//希尔排序

void ShellInsert(int elem[],int n,int incr)

{

for (int i=incr;i

{

int e=elem[i];

int j;

for (j=i-incr;j>=0 && e

{

elem[j+incr]=elem[j];

}

elem[j+incr]=e;

}

}

void ShellSort(int elem[],int n, int inc[],int t)

{

for (int k=0;k

{

ShellInsert(elem,n,inc[k]);

}

}

int main()

{

int a[101],data[101],shelldata[101],n=100,i;

cout

srand((unsigned)time(NULL));

for (i=0; i

{

a[i]=rand()%1000;

data[i]=a[i];

shelldata[i]=a[i];

coutif ((i+1)%10==0)

{

cout

}

}

BubbleSort(a,n);

cout

for (i=0; i

{

coutif ((i+1)%10==0)

{

cout

}

}

QuickSort(data,0,n-1);

cout

for (i=0; i

{

cout

if ((i+1)%10==0)

{

cout

}

}

int incr[]={50,25,12,6,3,1};

int t=6;

ShellSort(shelldata,n,incr,t);

cout

for (i=0; i

{

cout

if ((i+1)%10==0)

{

cout

}

}

return 0;

}

实验5-2

主要代码:

#include

#include

using namespace std;

#define N 100

void swap (int &var1, int &var2)

{

int temp = var1;

var1 = var2;

var2 = temp;

}

void shuffle(int *array)

{

int current = 0;

int end = N-1;

int begin = 0;

while( current

{

if( array[current] ==0 )

{

swap(array[current],array[begin]);

current++;

begin++;

}

else if( array[current] == 1 )

{

current++;

}

else{//if array[current] =2

swap(array[current],array[end]);

end--;

}

}

}

int main()

{

int a[N];

int i;

cout

for( i=0 ; i

{

a[i] = rand()%3;

cout

}

cout

cout

shuffle(a);

for(i=0 ; i

{

cout

}

cout

return 0;

}

实验心得

数据结构是一门设计数据的结构的学科,要把书本上学到的东西运用到实践中去并不简单,我刚开始自己运用学到的知识去编程的时候有些不知所措,有些东西不能理解,这对初学者来说确实很难,又拿起课本仔细的研究了一下,询问了老师和同学才搞懂了一些东西,自己的程序才能顺利运行。

通过这门课程和这些实验让我逐渐了解了数据结构这门学科,也渐渐对编程加强了兴趣,总之学到了很多也得到了很多,感谢同学和老师对我的帮助和鼓励。


相关文章

  • 天然药物化学设计性镐药剂09实验方案
  • 天然药物化学设计性实验方案 生命科学与工程学院药物制剂专业 任课教师:李楠 孔阳 天然药物化学是药学专业的一门专业基础课,它涉及到有机化学.中药药剂学.生药学.波谱学等多个学科的内容,是运用化学.生药学的原理和方法来研究天然植物药的有效化学 ...查看


  • 应用统计学试验二报告模板研究生
  • 高级管理统计实验报告 一.实验目的 本实验是<高级管理统计>课程的实践环节,通过实验,对所学理论知识进行进一步理解.让学生能够应用SPSS软件有效提高学生的数据处理能力,使学生掌握研究群体现象的基本方法,获得处理实际管理问题的本 ...查看


  • 数据库原理实验指导书 (1)
  • <数据库原理实验指导书> 河南科技大学电子信息工程学院 赵海霞 目录 实验规则 .......................................................................... ...查看


  • 实验室异常情况调查处理规定
  • 目的:制定检验中出现的异常值时应采取的措施,查明原因(生产.取样.样品保存和检验),并采取纠正预防措施,避免重复出现. 范围:适用于在质检科处进行的各项成品检测.中间体检测.原辅料检测.工艺用水检测等. 职责: 1.检验人员职责: (1) ...查看


  • 2011年高校实验室间比对活动的总结报告
  • 2011年高校实验室间比对活动的总结报告 ( 高校评审组 2011.11) 为加强高校计量认证实验室能力建设,促进实验室规范化管理,强化高校实验室出具证明性数据的可靠性和规范性,国家计量认证高校评审组根据国家认监委的有关规定,于2011年5 ...查看


  • 重庆大学数据库实验报告2
  • <数据库系统>实验报告 备注: 1.教师在布置需撰写实验报告的实验前,应先将报告书上的"实验题 目"."实验性质"."实验目的"."实验项目内容"等 ...查看


  • 大学物理实验论文-完整版[1]-好[1]
  • 大学物理实验论文 标题:物理实验的感悟与体会 摘要:在本学期的实验课中,我感悟和体会很多,让我学到许多平时学习不到的大学.虽然在很多的物理实验中,我们只是在复现课堂上所学的理论知识原理与效果,但因为物理实验有着诸多不同的因素,要求我们必须端 ...查看


  • SQL实验报告总结
  • <数据库系统概论(第四版)> 体 会 学号: 姓名: 班级: 教师: 学 期实 验 总 结 与 心 得 [实验名称] 数据库的创建 [实验内容] 1.新建sql注册表. 2.新建数据库.主数据文件:逻辑文件名为student_d ...查看


  • 大学生计算机基础实验报告
  • < 大学计算机基础>课程 实验报告手册 学院 年级 专业 姓名 学号 任课教师 上机地点 (以上由学生填写) 实验教师(签字) 西南大学计算机与信息科学学院 计算机基础教育系 年 月 日 一. 实验说明 本课程实验分为一般性实验 ...查看


  • 2013级基础物理实验选课及课程说明
  • 2013级基础物理实验选课及课程说明 网上选课操作方法 物理实验选课在网上进行,可通过两个途径:① 使用校园网(网址:http://phylab.buaa.edu.cn):② 使用物理实验中心局域网(地点:实3-415选课室,时间:下午13 ...查看


热门内容