数据结构课程设计(报告)
数据结构课程设计
集合的并、交和差运算的程序
电气与计算机学院
2017 年 6 月
数据结构课程设计(报告)
数据结构课程设计
集合的并、交和差运算的程序
小组成员: 齐德涵
指导教师:穆全伶
专
业:网络工程
所在单位:电气与计算机学院
数据结构课程设计(报告)
目 录
一、题目的内容及要求 ------------------------------------------------1
二、需求分析 ------------------------------------------------------------1
三、概要设计 ------------------------------------------------------------1
四、详细设计 ------------------------------------------------------------2
五、源代码 (见附录 2)----------------------------------------------3
六、运行结果及分析 ---------------------------------------------------6
七、参考文献 ------------------------------------------------------------7
八、附录 1 -----------------------------------------------------------------8
九、附录 2 -----------------------------------------------------------------9
十、总结 ------------------------------------------------------------------14
数据结构课程设计(报告)
一、题目的内容及要求
编制一个能演示执行集合的并、交和差运算的程序。
(1)集合的元素限定为小写字母符[′a′„.′z ′],集合的大小 n<27。
⑵集合输入的形式为一个以"回车符"为结束标志的字符串,串中字符
顺序不限,且允许出现重复字符或非法字符,程序应能自动滤去。
⑶输出的运算结果字符串中将不含重复字符或非法字符。
⑷演示程序以用户和计算机的对话方式执行。
二、需求分析
该程序可以实现输入两组集合,且限定仅小写字母能插入到集合中。
用户可能根据需求实现输入两个长度自定的集合,通过按键输入求两
集合的交集,并集,差集运算,并显示出结果。
三、概要设计(包括选择什么数据结构?数据结构采用哪种存储方式?
选择的原因?设计哪些操作?这些操作之间的调用关系等等)
1.数据结构的选择
该程序选用单链表进行编写,链式存储结构是用一组任意的存储单元
来存放线性表中的数据元素。
数据域
指针域
数据域:data(元素本身)
指针域:next(直接后继的存储位置)
2.选择的原因
单链表查取元素的时间复杂度小,一般只为 O(n)和 while 的使用频
- 1 -
数据结构课程设计(报告)
度有关。使用单链表每个元素都有结点构成,属于线性结构而且单链
表可以扩充。采用动态存储,方便删减和操作。
3.设计的操作及操作间的关系
该程序采用用户与控制台对话的方式,通过按键实现对两个集合交、
并、差以及退出当前程序的运算。程序开始先定义并置空三个链表,
调用输入函数在前两个链表中分别输入两个集合的元素,采用 switch
分支语句,以按键控制操作选择要执行的操作,分别调用不同的函数
方法,将结果输入到第三个链表中,通过输出函数输出结果。
四、详细设计(包括数据结构的类型定义,每个操作的算法描述)
结构体创建:
typedef struct node{
char data;
//本结点的值
node* next;
//下一个结点
}lnode,*linklist;
首先定义并置空三个链表,根据用户输入两个集合的数据。
lnode *A,*B,*C;
void input(linklist l)
//输入
void output(linklist l) //输出
lnode *zhikong() //置空
- 2 -
数据结构课程设计(报告)
在 switch 分支语句中根据按键调用并、交、差、退出程序函数
void jiaoji(linklist A,linklist B,linklist C)
//交集
void bingji(linklist A,linklist B,linklist C)
//并集
void chaji1(linklist A,linklist B,linklist C)
//A 与 B 的差集
void chaji2(linklist A,linklist B,linklist C)
//B 与 A 的差集
五、源代码(请详见附录 2)
置空函数:
lnode *zhikong(){
//置空
lnode *l;
l=(lnode*)malloc(sizeof(lnode));
l->next=NULL;
return l;
}
输入函数:
void input(linklist l){ //输入
lnode *s;
int num,a[90000]={0};
char x;
printf("请先输入集合长度:\n");
cin>>num;
printf("请输入集合内元素:\n");
while(num!=0){
cin>>x;
a[x]++;
if(x>='a'&&x<='z'&&a[x]==1){
s=(lnode*)malloc(sizeof(lnode));
s->data=x;
s->next=l->next;
l->next=s;
}
num--;
}
- 3 -
数据结构课程设计(报告)
//输出
l=zhikong();
}
输出函数:
void output(linklist l){
lnode *s;
s=l->next;
while(s!=NULL){
}
printf("\n");
}
并集函数:
printf("%2c",s->data);
s=s->next;
void bingji(linklist A,linklist B,linklist C){ //并集
lnode *p,*q,*t;
p=A->next;
while(p!=NULL){
t=(lnode*)malloc(sizeof(lnode));
t->data=p->data;
t->next=C->next;
C->next=t;
p=p->next;
}
q=B->next;
while(q!=NULL){
p=p->next;
if(p==NULL){
p=A->next;
while((p!=NULL)&&(p->data!=q->data))
t=(lnode*)malloc(sizeof(lnode));
t->data=q->data;
t->next=C->next;
C->next=t;
}
q=q->next;
}
}
交集:
void jiaoji(linklist A,linklist B,linklist C){ //交集
lnode *p,*q,*t;
p=A->next;
- 4 -
数据结构课程设计(报告)
while(p!=NULL){
q=B->next;
while((q!=NULL)&&(q->data!=p->data))
q=q->next;
if((q!=NULL)&&(q->data==p->data)){
t=(lnode*)malloc(sizeof(lnode));
t->data=p->data;
t->next=C->next;
C->next=t;
}
p=p->next;
}
}
}
A- B 的差集:
void chaji1(linklist A,linklist B,linklist C){ //A 与 B 的差集
lnode *p,*q,*s;
p=A->next;
while(p!=NULL){
q=q->next;
if(q==NULL){
q=B->next;
while((q!=NULL)&&(p->data!=q->data))
s=(lnode*)malloc(sizeof(lnode));
s->data=p->data;
s->next=C->next;
C->next=s;
}
p=p->next;
}
B- A 的差集:
void chaji2(linklist A,linklist B,linklist C){ //B 与 A 的差集
lnode *p,*q,*s;
p=B->next;
while(p!=NULL){
q=q->next;
if(q==NULL){
q=A->next;
while((q!=NULL)&&(p->data!=q->data))
s=(lnode*)malloc(sizeof(lnode));
s->data=p->data;
s->next=C->next;
- 5 -