数据结构 集合运算

  • 格式:docx
  • 大小:210.63 KB
  • 文档页数:16

数据结构课程设计报告

设计题目:集合运算

学生姓名:

专业:软件工程

班级:

学号:

指导老师:

完成日期:

合肥工业大学软件学院 数据结构与算法课程设计

一、 需求和规格说明

问题描述:

设有两个用单链表表示的集合A、B,其元素类型是int且以非递减方式存储,其头结点分别为a、b。要求下面各问题中的结果集合同样以非递减方式存储,结果集合不影响原集合。

实现要求:

⑴ 编写集合元素测试函数IN_SET,如果元素已经在集合中返回0,否则返回1;

⑵ 编写集合元素输入并插入到单链表中的函数INSERT_SET,保证所输入的集合中的元素是唯一且以非递减方式存储在单链表中;

⑶ 编写集合元素输出函数,对建立的集合链表按非递增方式输出;

⑷ 编写求集合A、B的交C=A∩B的函数,并输出集合C的元素;

⑸ 编写求集合A、B的并D=A∪B的函数,并输出集合D的元素;

⑹ 求集合A与B的对称差E=(A-B)∪(B-A) 的函数,并输出集合D的元素;

⑺ 设计一个菜单,具有输入集合元素、求集合A、B的交C、求集合A、B的并D、求集合A与B的对称差E、退出等基本的功能。

测试数据:由读者自定,但集合A、B的元素个数不得少于16个。

二、设计

1. 存储结构

链表

2. 操作函数

void creatlist ();创建集合

void increaseArray ();递增排序

void decreaseArray ();递减排序

void showArray ();输出集合

void AandB ( list a , list b);交运算

void AorB ( list a , list b );并运算

void AaddB ( list a , list b);和运算

void AsubtractB( list a , list b );集合减运算

void symmetricDifference ( list a , list b );对称差运算

void AequalB ( list a );复制

void INSERT_SET ( );递增储存

void DECREASESHOW( );递减输出

int IN_SET ( int i );检测是否在集合中,并返回值

二、 用户手册

1. 首先先建立两个做实验的集合A和B

2. 自动显示你所建的集合

3. 进入选择界面,选择你想要用的功能(数字表示)

4. 执行功能,输出结果

5. 自动退出程序

四、 调试与测试

分别展示六个功能

1.

2.

3.

4.

5.

6.

五、 复杂度分析 做的时候没有考虑复杂度问题,主要就是求交集的时候先排序再求交还是先求交集在排序的问题,如果代码是顺序的,可以让求交集这个操作复杂度变成了o(m + n);比先求交在排序复杂度低很多。而且做课题时并没有把复杂度加入代码的考虑之中

六、 附录

主要为三个文件,目录是控制台(汗。。。。。用switch-case做的)

1. list.h

struct node

{

node *next;

int data;

};

class list

{

public:

list ();

int length () const;

~list ();

int get_element (const int i) const;

void insert (const int i,const int x);

void delete_element (const int i);

void creatlist ();

void increaseArray ();

void decreaseArray ();

void showArray ();

node *gethead ()

{

return head;

}

void AandB ( list a , list b);

void AorB ( list a , list b );

void AaddB ( list a , list b);

void AsubtractB( list a , list b );

void symmetricDifference ( list a , list b );

void AequalB ( list a );

void INSERT_SET ( );

void DECREASESHOW( );

int IN_SET ( int i );

private:

int count;

node *head;

};

2. list.cpp

#include"list.h"

#include

using namespace std;

list::list ()

{

head = new node;

head -> next = NULL;

count = 0;

head -> data = 0;

}

int list::length ()const

{

return count;

}

int list::get_element(const int i)const

{

node *p;

p = head -> next;

int j=1;

while ( p != NULL && j != i )

{

p = p -> next;

j ++;

}

if ( p == NULL )

return -1;

else

return p -> data;

}

void list::insert(const int i,const int x)

{

node *p;

p = head -> next;

int j = 0;

while ( p != NULL && j != i - 1)

{

p = p -> next;

j ++;

}

if ( i < 1 || i > count + 1 )

return; else

{

node *s = new node;

s -> data = x;

s -> next = p -> next;

p -> next = s;

count ++;

}

}

void list::delete_element(const int i)

{

node *p = head;

int j = 0;

while ( j != i -1 && p != NULL)

{

p = p -> next;

j ++;

}

if ( i < 1 || i > count )

return;

else

{

node *u = p -> next;

p -> next = u -> next;

delete u;

count --;

}

}

void list::creatlist ()

{

int x;

cout <<" 输º?入¨?数ºy据Y:êo"<< endl;

cin >> x;

node *rear = head;

while ( x != -1)

{

count ++;

node *s = new node;

s -> data = x;

rear -> next = s;

rear = s;

rear -> next = NULL;

cout <<" 输º?入¨?数ºy据Y:êo"<< endl;

cin >> x; }

}

void list::increaseArray ()

{

for ( int i = 1 ; i <= count ;i ++ )

{

node *p = head -> next;

while ( p -> next != NULL)

{

if ( p -> data >= ( p -> next ) -> data)

{

int i = p -> data;

p -> data = ( p -> next ) -> data;

( p -> next ) -> data = i;

}

p = p -> next;

}

}

}

void list::showArray()

{

node *p = head -> next;

while( p != NULL )

{

cout << p -> data <<" ";

p = p -> next;

}

}

list::~list ()

{}

void list::decreaseArray()

{

for ( int i = 1 ; i <= count ;i ++ )

{

node *p = head -> next;

while ( p -> next != NULL)

{

if ( p -> data <= ( p -> next ) -> data)

{

int i = p -> data;

p -> data = ( p -> next ) -> data;

( p -> next ) -> data = i;

}