当前位置:文档之家› 双向链表课程设计报告

双向链表课程设计报告

双向链表课程设计报告
双向链表课程设计报告

VC++课程设计报告

VC++课程设计报告

课程:VC++课程设计

学号:

姓名:

选题名称:双向链表

选题难易级别:A级

起止时间:2012年3月01日~2012年4月07日

指导教师:

目录

一、课题目标

1.1 程序功能简介

1.2 课程设计要求

1.3 评定难易级别

二、具体实现

2.1 程序总体方案

2.1.1开发平台

2.2 改进方案

2.2.1改进一

2.2.1.1 改进方案

2.2.1.2 具体实现

2.2.2改进二

2.2.2.1 改进方案

2.2.2.2 具体实现

2.2.3 改进三

2.2.

3.1 改进方案

2.2.

3.2 具体实现

2.2.4改进四

2.2.4.1改进方案

2.2.4.2具体实现

2.2.5改进五

2.2.5.1改进方案

2.2.5.2具体实现

三、运行结果

一、课题目标

1.1 程序功能简介

原程序定义了模版数据类型的双向链表类型,并定义了链表的插入,删除和输出操作的成员函数。

1.2 课程设计要求

(1)在原程序的基础上扩充双向链表的功能,增加排序插入,根据数据查找结点及修改结点数据等功能。

(2)将结点据数据改成通讯录中的一个纪录,增加年龄,姓名,电话等数据;并能根据姓名进行向前或向后查找,链表根据姓名排序。

(3)根据姓名查找记录时支持通配符*和?,即*通配任意字符和字符串,?通配一个字符,字符不分大小写。

(4)可以修改某个结点,即修改其中的年龄和电话字段,修改时新旧记录要同时显示在屏幕上,新纪录按“确认”键后才替代旧记录,否则取消修改操作。(5)将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。

1.3 评定难易级别

A级

二、具体实现

2.1 程序总体方案

2.1.1开发平台

操作系统:Windows XP

开发工具:VC++6.0

2.2改进方案

2.2.1改进一

2.2.1.1 改进方案

完成类的封装

2.2.1.2具体实现

template< class NodeType > class Node;

template< class NodeType > class DoubleLinkList;

using namespace std;

template

class Node

{

friend class DoubleLinkList< NodeType >;

private :

NodeType Data;

Node< NodeType > *NextNode;

Node< NodeType > *PreviousNode;

public :

Node();

Node( NodeType &V alue );

~Node();

void show()

{

cout<<"\t\t姓名:"<

<<"\t\t电话号码:"<

<<"\t\t年龄:"<

} //输入节点数据

};

template< class NodeType >

class DoubleLinkList

{

private :

Node< NodeType > *FirstNode;

Node< NodeType > *RearNode;

public :

DoubleLinkList();

~DoubleLinkList();

bool IsEmpty();

void InsertAtFront();

void InsertAtRear();

void InsertAtMiddle();

bool RemoveFromFront();

bool RemoveFromRear();

bool RemoveFromMiddle();

void TraverseForwards();

void TraverseBackwards();

int LenghtOfDoubleLinkList();

void AddNode();//排序插入链表节点

void DelByName();//根据姓名删除节点

void DelByIndex();//根据序号删除节点

int SearchName(char *name);//根据姓名查找节点

bool UpdateByName(char *name);//根据姓名修改节点

bool UpdateByIndex(int index);//根据序号修改节点

bool LoadFromFile();//从文件中输入数据

bool SaveToFile();//将数据储存进文件

bool compstr(char *name,char *search1);//模糊比较

Node< NodeType > *CreateNode();

void PrintList();

void paixu();

};

2.2.2改进二

2.2.2.1 改进方案

主菜单具体化,使内容更加详尽完备。

2.2.2.2具体实现

int main()

{

DoubleLinkList List;

int Option,i;

char Name[20];

char str[20];

int option=0,index=0;

cout<<"\t\t\t 欢迎使用双向链表通讯录(鄢悦(1111250106)制作)"<

do

{

cout<<"\t\t\t\t 主菜单"<

cout<<"

********************************************************************* ***"<

cout<<" 1) 查看全部数据"<

cout<<" 2) 删除数据"<

cout<<" 3) 添加数据(数据按姓名顺序排列)"<

cout<<" 4) 修改数据"<

cout<<" 5) 查找数据"<

cout<<" 6) 从文件中输入数据"<

cout<<" 7) 将数据输出至文件并存盘"<

cout<<" 8) 退出程序"<

cout<<" 请输入你的选择序号: ";

cin>>Option;

while(!cin)//当输入的数据类型与定义的变量类型不一致的时候

{

cin.clear();//清空输入缓冲区

cin.getline(str,20);//接收原输入数据

cout<<"\n\n 非法输入!请输入一个整数:";

cin>>Option;//重新输入

}

switch(Option)

{

case 1 ://查看全部数据

do{

cout<<" -----------------------------------"<

cout<<" 1) 从前往后查看全部数据"<

cout<<" 2) 从后往前查看全部数据"<

cout<<" 3) 返回主菜单"<

cout<<" 请输入你的选择:";

cin>>i;

while(!cin||(i>4||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围

{

cin.clear();//清空输入缓冲区

cin.getline(str,20);//接收原输入数据

cout<<"\n\n 非法输入!请输入一个整数

(1~3):";

cin>>i;//重新输入

}

switch(i)

{

case 1:List.TraverseForwards();

cin.get();

system("cls");

break;

case 2:List.TraverseBackwards();

cin.get();

system("cls");

break;

case 3:Option=3;

cin.get();

system("cls");

break;

}

}while(Option!=3);

break;

case 2 ://删除数据

do{

cout<<" -----------------------------------"<

cout<<" 1) 将数据从通讯录头删除"<

cout<<" 2) 将数据从通讯录尾删除"<

cout<<" 3) 按序号删除数据"<

cout<<" 4) 按姓名删除数据"<

cout<<" 5) 返回主菜单"<

cout<<" 请输入你的选择:";

cin>>i;

while(!cin||(i>5||i<1))//当输入的数据类型与定义的变量

类型不一致的时候或超范围

{

cin.clear();//清空输入缓冲区

cin.getline(str,20);//接收原输入数据

cout<<"\n\n 非法输入!请输入一个整数(1~5):";

cin>>i;//重新输入

}

switch(i)

{

case 1:List.RemoveFromFront();//将数据从通讯录头删除

cin.get();

cout<<"\n删除后:\n\n"<

List.PrintList();

cout<<"\n\n按任意键继续..."<

cin.get();

system("cls");

break;

case 2:List.RemoveFromRear();//将数据从通讯录尾删除

cin.get();

cout<<"\n删除后:\n\n"<

List.PrintList();

cout<<"\n\n按任意键继续..."<

cin.get();

system("cls");

break;

case 3:

List.DelByIndex();//按序号删除结点

cin.get();

cout<<"\n删除后:\n\n"<

List.PrintList();

cout<<"\n\n按任意键继续..."<

cin.get();

system("cls");

break;

case 4:

List.DelByName();

cin.get();

cout<<"\n删除后:\n\n"<

List.PrintList();

cout<<"\n\n按任意键继续..."<

cin.get();

system("cls");

break;

case 5:

Option=5;

system("cls");

break;

}

}while(Option!=5);//结束循环,退回主菜单

break;

case 3://添加数据(按姓名顺序排列)

do

{

cout<<" -----------------------------------"<

cout<<" 1) 将数据插入到通讯录头"<

cout<<" 2) 将数据插入到通讯录尾"<

cout<<" 3) 将数据插入到通讯录中间"<

cout<<" 4) 排序插入数据"<

cout<<" 5) 退回主菜单"<

cout<<" 请输入你的选择:";

cin>>i;

while(!cin||(i>5||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围

{

cin.clear();//清空输入缓冲区

cin.getline(str,20);//接收原输入数据

cout<<"\n\n 非法输入!请输入一个整数

(1~5):";

cin>>i;//重新输入

}

switch(i)

{

case 1:

cout<<"\n\n";

List.InsertAtFront();//将数据插入到通讯录头

List.PrintList();

cout<<"\n\n按任意键继续..."<

getch();

system("cls");

break;

case 2:

cout<<"\n\n";

List.InsertAtRear();//将结点插入到链表尾

List.PrintList();

cout<<"\n\n按任意键继续..."<

getch();

system("cls");

break;

case 3:

cout<<"\n\n";

List.InsertAtMiddle();//将结点插入到链表中间

List.PrintList();

cout<<"\n\n按任意键继续..."<

getch();

system("cls");

break;

case 4:

List.AddNode(); //排序插入链表结点

List.PrintList();

cout<<"\n\n按任意键继续..."<

getch();

system("cls");

break;

case 5:

i=5;

system("cls");

break;

}

}while(i!=5);

break;

case 4 ://修改数据

do

{

cout<<" -----------------------------------"<

cout<<" 1) 按姓名修改"<

cout<<" 2) 按序号修改"<

cout<<" 3) 返回主菜单"<

cout<<" 请输入你的选择:";

cin>>i;

while(!cin||(i>3||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围

{

cin.clear();//清空输入缓冲区

cin.getline(str,20);//接收原输入数据

cout<<"\n\n 非法输入!请输入一个整数

(1~3):";

cin>>i;//重新输入

}

switch(i)

{

case 1:

do{

i=List.LenghtOfDoubleLinkList();

cout<<" 请输入姓名:";

cin>>Name;

cout<<" 姓名为:"<

cout<<" 确认吗??[Y/N](输入非Y 按N算)";

cin>>str;

if(strlen(str)!=1||(str[0]!='Y'&&str[0]!='y')) i=1;

else i=0;

}while(i);

List.UpdateByName(Name);//按姓名修改结点

break;

case 2:

do{

cout<<" 通讯录如下:\n";

i=List.LenghtOfDoubleLinkList();

cout<<"\t请输入序号:";

cin>>index;

while(!cin)//当输入的数据类型与定义的变量类型不一致的时候

{

cin.clear();//清空输入缓冲区

cin.getline(str,20);//接收原输入数据

cout<<"\n\n 非法输入!请输入一个整数:";

cin>>index;//重新输入

}

cout<<"\t序号为:"<

cout<<"\t确认吗??[Y/N](输入非Y按N算)";

cin>>str;

if(strlen(str)!=1||(str[0]!='Y'&&str[0]!='y')) i=1;

else

{

if(i

{

cout<<" 对不起,没有这个序号,请重新输入"<

i=1;

}

i=0;

}

}while(i);

List.UpdateByIndex(index);//按序号修改结点

break;

case 3:

option=3;

system("cls");

break;

}

}while(option!=3);//结束循环,退回主菜单

break;

case 5 ://查找数据

do

{

cout<<" -----------------------------------"<

cout<<" 1) 按姓名查找"<

cout<<" 2) 返回主菜单"<

cout<<" 请输入你的选择:";

cin>>i;

while(!cin||(i>3||i<1))//当输入的数据类型与定义的变量类型不一致的时候或超范围

{

cin.clear();//清空输入缓冲区

cin.getline(str,20);//接收原输入数据

cout<<"\n\n 非法输入!请输入一个整数

(1~3):";

cin>>i;//重新输入

}

switch(i)

{

case 1:

do{

cout<<" 请输入姓名:";

cin>>Name;

cout<<" 姓名为:"<

cout<<" 确认吗??[Y/N](输入非Y按N 算)";

cin>>str;

if(strlen(str)!=1||(str[0]!='Y'&&str[0]!='y'))

i=1;

else i=0;

}while(i);

List.SearchName(Name);//按姓名查找通讯录

cout<<"\n\n按任意键继续..."<

cin.get();

system("cls");

break;

case 2:option=2;

system("cls");

break;

}

}while(option!=2);//结束循环,退回主菜单

system("cls");

break;

case 6://从文件中输入数据

List.LoadFromFile();

List.PrintList();

cout<<"\n\n按任意键继续..."<

cin.get();

system("cls");

break;

case 7 ://将数据输出之文件并存盘

List.SaveToFile();

system("cls");

break;

case 8:

break;

default :

{

cout<<"\t选择范围超出菜单给定,重新输入?[Y/N](输入非Y按N算)";

cin>>str;

if(strlen(str)!=1||(str[0]!='Y'&&str[0]!='y')) Option=1;

else Option=8;

}

}

}

while(Option!=8);//结束循环,测试完成

return 0;

}

2.2.3改进三

2.2.

3.1改进方案

通配符的模糊匹配功能

2.2.

3.2具体实现

template//定义通配符模糊匹配函数

bool DoubleLinkList::compstr(char *name,char *search1)

{

int i,l,l1;

bool flag1,flag2;

char name1[20];

l1=strlen(name);

strcpy(name1,name);

for(i=0;i

{

if((name[i]>='A')&&(name[i]<='Z'))

name1[i]+='a'-'A';

}

l=strlen(search1);

if(l1

for(i=0;i

{

if(search1[i]!=name1[i])

break;

}

if(search1[i]=='*')

flag1=true;

else

flag1=false;

if(l1==l)//关于?的模糊比较

{

for(i=0;i

{

if(search1[i]!=name1[i]&&search1[i]!='?')

break;

}

if(i

else

flag2=true;

}

else

flag2=false;

return (flag1||flag2);

}

2.2.4改进四

2.2.4.1改进方案

改将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。

2.2.4.2具体实现

bool DoubleLinkList::LoadFromFile()//从文件中调出通讯录

{

Node *temp1,*temp2;

ifstream infile;

infile.open("A.txt",ios::in);

if(!infile)

{

cout<<"未找到文件!"<

return false;

}

if(FirstNode!=NULL)

{

cout<<"\n\n\t文件已经打开!\n"<<"\t若要重新打开,请关闭程序,重新运行!\n"<

cin.get();

cout<<"\n\n已经打开的文件:"<

return false;

}

while(!infile.eof())

{

char temp=' ';

temp1=new Node;

while(!((temp>='a'&&temp<='z')||(temp>='A'&&temp<='Z'))&&!infile.eof()) {

temp=infile.get();

}

int n=0;

while((temp>='a'&&temp<='z')||(temp>='A'&&temp<='Z')&&!infile.eof())

{

temp1->https://www.doczj.com/doc/1214870278.html,[n]=temp;

temp=infile.get();

n++;

}

temp1->https://www.doczj.com/doc/1214870278.html,[n]='\0';

while(!(temp>='0'&&temp<='9')&&!infile.eof())

{

temp=infile.get();

}

int t=0;

while(temp>='0'&&temp<='9'&&!infile.eof())

{

temp1->Data.tel[t]=temp;

temp=infile.get();

t++;

}

temp1->Data.tel[t]='\0';

while(!(temp>='0'&&temp<='9')&&!infile.eof())

{

temp=infile.get();

}

int a=0;

while(temp>='0'&&temp<='9'&&!infile.eof())

{

int t=temp-'0';

a=t+10*a;

temp=infile.get();

}

temp1->Data.age=a;

if(FirstNode==NULL)

{

FirstNode=temp1;

RearNode=temp1;

temp2=temp1;

temp2->PreviousNode=NULL;

}

else{

temp2->NextNode=temp1;

temp1->PreviousNode=temp2;

temp2=temp1;

RearNode=temp1;

temp1->NextNode=NULL;

}

}

RearNode=RearNode->PreviousNode;

RearNode->NextNode=NULL;

cin.get();

infile.close();

paixu();

return true;

}

template//将数据存储进文件

bool DoubleLinkList::SaveToFile()

{

ofstream outfile;

ifstream infile;

char FileName[20];

cout<<"\n -----------------------------------"<

cout<<" 请输入文件名:";

cin.get();

cin.getline(FileName,20);

outfile.open(FileName,ios::out);//以输出的方式打开数据文件

if(!outfile) //打开文件错误,输出提示信息,退

出程序

{

cout<<" 打开文件错误!"<

cout<<"\n 按任意键继续"<

cout<<" -----------------------------------"<

getch();

return false;

}

infile.open(FileName,ios::in);

int i=0;

while(i<5)

{

infile.get();

if(infile.eof())

{

outfile.setf(ios::left);

outfile.width(20);

outfile<<"姓名";

outfile.width(20);

outfile<<"电话号码";

outfile.width(10);

outfile<<"年龄"<<'\n';

break;

}

i++;

}

Node *CurrentNode=FirstNode; //定义结点指针

while(CurrentNode) //当指针没有到链表尾结点时

{

outfile.setf(ios::left);

outfile.width(20);

outfile<https://www.doczj.com/doc/1214870278.html,;

outfile.width(20);

outfile<Data.tel;

outfile.width(10);

outfile<Data.age<<'\n';

CurrentNode=CurrentNode->NextNode; //顺着链表依次指向下一结点

}

infile.close();

outfile.close();

cout<<" 文件存储完毕!"<

cout<<"\n 按任意键继续"<

cout<<" -----------------------------------"<

getch();

return true;

}

2.2.5改进五

2.2.5.1改进方案

各个函数的修改

2.2.5.2具体实现

template

void DoubleLinkList::PrintList()

{

cout<<"\n\n通讯录:\n";

if(FirstNode==NULL)

{

cout<<"\t\t为空!\n";

cin.get();

return ;

}

cout.setf(ios::left);

cout.width(20);

cout<<"姓名";

cout.width(20);

cout<<"电话号码";

cout.width(10);

cout<<"年龄"<<'\n';

Node*p=FirstNode;

while(p!=NULL)

{

cout.setf(ios::left);

cout.width(20);

cout<https://www.doczj.com/doc/1214870278.html,;

cout.width(20);

cout<Data.tel;

cout.width(10);

cout<Data.age<<'\n';

p=p->NextNode;

}

}

template< class NodeType >

void DoubleLinkList< NodeType >::paixu()

{

Node *p,*q,*t,*r;

q=t=FirstNode;

r=RearNode;

int i=0,length=LenghtOfDoubleLinkList();

while(i

{

q=FirstNode;

int j=0;

while(q->NextNode!=NULL&&j

{

t=q->NextNode;

if(strcmp(q->https://www.doczj.com/doc/1214870278.html,,t->https://www.doczj.com/doc/1214870278.html,)>0)

{

if(q!=FirstNode)

{

q->PreviousNode->NextNode=t;

}

else

{

FirstNode=t;

}

if(t!=RearNode)

{

t->NextNode->PreviousNode=q;

}

else

{

RearNode=q;

}

q->NextNode=t->NextNode;

t->NextNode=q;

t->PreviousNode=q->PreviousNode;

q->PreviousNode=t;

}

else{

q=q->NextNode;

}

j++;

}

i++;

}

}

void DoubleLinkList< NodeType >::AddNode()

{

InsertAtFront();

paixu();

}

/******************************************************************** **/

template< class NodeType >

void DoubleLinkList< NodeType >::DelByName()

{

char Name[20];

cin.get();

cout<<" 请输入姓名:";

cin.getline(Name,20);

cout<<" 姓名为:"<

cout<<" 确认吗??[Y/N]:";

char t=cin.get();

while(t!='Y'&&t!='y'&&t!='n'&&t!='N')

{

cin.get();

cout<<"\n\n 非法输入! 请输入(Y/N):";

t=cin.get();

}

switch(t)

{

case 'Y':

case 'y':

break;

case 'N':

case 'n':

return;

}

Node *p,*q,*n;

int i;

int m=LenghtOfDoubleLinkList();

p=q=FirstNode;

cout<<"\n\n 删除了:\n"<

i=SearchName(Name);

if(i==1)

{

RemoveFromFront();

城市链表实验报告

2014-2015学年第一学期实验报告 课程名称:算法与数据结构 实验名称:城市链表

一、实验目的 本次实验的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。同时,通过本次实验帮助学生复习高级语言的使用方法。 二、实验内容 (一)城市链表: 将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。 (二) 约瑟夫环 m 的初值为20;密码:3,1,7,2,6,8,4(正确的结果应为6,1,4,7,2,3,5)。三、实验环境 VS2010 、win8.1 四、实验结果 (一)城市链表: (1)创建城市链表; (2)给定一个城市名,返回其位置坐标; (3)给定一个位置坐标P 和一个距离D,返回所有与P 的距离小于等于 D 的城市。 (4)在已有的城市链表中插入一个新的城市; (5)更新城市信息; (6)删除某个城市信息。 (二) 约瑟夫环 m 的初值为20;密码:3,1,7,2,6,8,4 输出6,1,4,7,2,3,5。 五、附录 城市链表: 5.1 问题分析 该实验要求对链表实现创建,遍历,插入,删除,查询等操作,故使用单链表。

5.2 设计方案 该程序大致分为以下几个模块: 1.创建城市链表模块,即在空链表中插入新元素。故创建城市链表中包涵插入模块。 2.返回位置坐标模块。 3.计算距离模块 4.插入模块。 5.更新城市信息模块 6.删除信息模块。 5.3 算法 5.3.1 根据中心城市坐标,返回在距离内的所有城市: void FindCityDistance(citylist *L){ //根据距离输出城市 ……//输入信息与距离 L=L->next; w hile(L != NULL){ if(((L->x-x1)*(L->x-x1)+(L->y-y1)*(L->y-y1 )<=dis*dis)&&(((L->x-x1)+(L->y-y1))!=0 )){ printf("城市名称%s\n",L->Name); printf("城市坐标%.2lf,%.2lf\n",L->x,L->y); } L=L->next; } } 该算法主要用到了勾股定理,考虑到不需要实际数值,只需要大小比较,所以只用 横坐标差的平方+纵坐标差的平方<= 距离的平方判定。

链表实验报告

C语言程序设计实验报告 实验一:链表的基本操作一·实验目的 1.掌握链表的建立方法 2.掌握链表中节点的查找与删除 3.掌握输出链表节点的方法 4.掌握链表节点排序的一种方法 5.掌握C语言创建菜单的方法 6.掌握结构化程序设计的方法 二·实验环境 1.硬件环境:当前所有电脑硬件环境均支持 2.软件环境:Visual C++6.0 三.函数功能 1. CreateList // 声明创建链表函数 2.TraverseList // 声明遍历链表函数 3. InsertList // 声明链表插入函数 4.DeleteTheList // 声明删除整个链表函数 5. FindList // 声明链表查询函数 四.程序流程图 五.程序代码 #include #include typedef int Elemtype; typedef int Status; typedef struct node//定义存储节点 { int data;//数据域 struct node *next;//结构体指针 } *linklist,node;//结构体变量,结构体名称 linklist creat (int n)//创建单链表 { linklist head,r,p;//定义头指针r,p,指针 int x,i; head=(node *)malloc(sizeof(node));//生成头结点

r=head;//r指向头结点 printf("输入数字:\n"); for(i=n;i>0;i--)//for 循环用于生成第一个节点并读入数据{ scanf("%d",&x); p=(node *)malloc(sizeof(node)); p->data=x;//读入第一个节点的数据 r->next=p;//把第一个节点连在头结点的后面 r=p;//循环以便于生成第二个节点 } r->next=0;//生成链表后的断开符 return head;//返回头指针 } void output (linklist head)//输出链表 { linklist p; p=head->next; do { printf("%3d",p->data); p=p->next; } while(p); printf("\n") } Status insert ( linklist &l,int i, Elemtype e)//插入操作 { int j=0; linklist p=l,s; while(jnext; ++j; } if(!p || j>i-1) return -1; else { s=(node *)malloc(sizeof(node)); s->data=e; s->next=p->next; p->next=s; return 1; } } Status delect ( linklist &l,int i, Elemtype &e)//删除操作 { int j=0; linklist p=l,q; while(jnext) { p=p->next; ++j; } if(!p->next || j>i-1) return -1;

数据结构实验集合的并交差运算实验报告记录

数据结构实验集合的并交差运算实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

实验报告 实验课程:数据结构 实验项目:实验一集合的并交差运算专业:计算机科学与技术 班级: 姓名: 学号: 指导教师:

目录一、问题定义及需求分析 (1)实验目的 (2)实验任务 (3)需求分析 二、概要设计: (1)抽象数据类型定义 (2)主程序流程 (3) 模块关系 三、详细设计 (1)数据类型及存储结构 (2)模块设计 四、调试分析 (1)调试分析 (2)算法时空分析 (3)经验体会 五、使用说明 (1)程序使用说明 六、测试结果 (1)运行测试结果截图 七、附录 (1)源代码

一、问题定义及需求分析 (1)实验目的 设计一个能演示集合的并、交、差运算程序。 (2)实验任务 1)采用顺序表或链表等数据结构。 2)集合的元素限定为数字和小写英文字母。 (3)需求分析: 输入形式为:外部输入字符串; 输入值限定范围为:数字和小写英文字母; 输出形式为:字符集; 程序功能:计算两个集合的交、并、差以及重新输入集合功能; 二、概要设计: (1)抽象数据类型定义: 线性表 (2)主程序流程: 调用主菜单函数初始化两个线性表作为集合给两个集合输入数据输出集合数据元素信息另初始化两个线性表创建选择功能菜单界面通过不同选项调用不同功能函数在每个功能函数里面加结束选择功能,实现循环调用功能菜单 计算完毕退出程序; (3)模块关系: 主菜单 差运算并运算交运算新建集合结束/返回 结束 三、详细设计 抽象数据类型定义: typedef struct{ ElemType *elem; int length; int listsize;

课程设计循环彩灯

课程设计说明书 课程名称:数字电子技术 设计题目:循环彩灯 院系:电子信息与电气工程学院 学生姓名:听风 学号:2010020200XX 专业班级:10级电子信息工程(1)班 指导教师: 2012 年5 月25日

课程设计任务书设计题目循环彩灯 学生姓名XX 所在院系电子信 息与电 气工程 学院 专业、年级、班 10级电子信息 工程(1)班 设计要求: 1、设计制作一个循环彩灯电路。 2、彩灯数量为8个,8个彩灯依次闪烁,彩灯亮灯时间为1秒。 3、器件:74LS192、74LS138、74LS00、555定时器各一片,48kΩ ,300 Ω,51kΩ,10uf,0.01uf各一个。 学生应完成的工作: 根据原理进行设计,方案论证,完成循环彩灯的原理图设计及PCB板的制作,手动布线完成PCB板图。然后将修改无误的PCB板图复制,转印,做板。再按照自己设计的电路原理图把电子元器件焊接到电路板上。经调试能正常工作,老师考查合格后,写好设计报告。 参考文献阅读: [1]童诗白.模拟电子技术基础[M].北京:高等教育出版社,2005. [2] 郑君里、杨为理信号与系统[M]北京:高等教育出版社,2011 [3] 谷树忠、刘文洲、姜航Altium Designer 教程北京:电子工业出版社,2006 [4]邱关源,罗先觉.电路(第五版)[M].北京:高等教育出版社,2006. [5]阎石.数字电子技术(第五版)[M].北京:高等教育出版社,2005. 工作计划: 2012年5月14日上午:课程设计说明、软件培训。下午:Multism电路仿真。 2012年5月15日:电路设计与仿真。 2012年5月16日上午:电路设计与仿真。下午:指导教师单独指导。 2012年5月17日:用Altium Designer 10设计原理图。 2012年5月18日:用Altium Designer 10设计PCB。 2012年5月21日上午:循环彩灯制版。下午:循环彩灯安装。 2012年5月22日:指导课程设计报告书写。 2012年5月23日:指导课程设计报告书写。 2012年5月24日:电路调试。 2012年5月25日:设计验收设计报告收交。 任务下达日期:2012 年 5 月14 日 任务完成日期:2012 年 5 月25 日 指导教师(签名):学生(签名):

单链表实验报告

计算机与信息技术学院综合性、设计性实验报告 一、实验目的 (1)熟悉顺序表的创建、取值、查找、插入、删除等算法,模块化程序设计方法。 二、实验仪器或设备 (1)硬件设备:CPU为Pentium 4 以上的计算机,内存2G以上 (2)配置软件:Microsoft Windows 7 与VC++6.0 三、总体设计(设计原理、设计方案及流程等) 设计原理: 单链表属于线性表,线性表的存储结构的特点是:用一组任意存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。因此,对于某个元素来说,不仅需要存储其本身的信息,还需要存储一个指示其直接后继的信息。 设计方案: 采用模块化设计的方法,设计各个程序段,最终通过主函数实现各个程序段的功能。设计时,需要考虑用户输入非法数值,所以要在程序中写入说可以处理非法数值的代码。 设计流程: 1. 引入所需的头文件; 2. 定义状态值; 3. 写入顺序表的各种操作的代码; 写入主函数,分别调用各个函数。在调用函数时,采用if结构进行判断输 入值是否非法,从而执行相应的程序 四、实验步骤(包括主要步骤、代码分析等) #include // EOF(=A Z 或F6),NULL #in clude // srand( ) ,rand( ),exit (n) #in clude // malloc( ),alloc( ),realloc() 等 #in clude // INT_MAX 等 #in clude #in clude #in clude // floor(),ceil( ),abs() #in clude // cout,ci n #in clude // clock( ),CLK_TCK,clock_t #defi ne TRUE 1 #defi ne FALSE 0 #defi ne OK 1 #defi ne ERROR 0 #defi ne INFEASIBLE -1

LED循环彩灯课程设计

××学院 《模拟电子技术》课程设计 题目 LED循环彩灯 学生姓名××× 专业班级电科(3)班 学号 201231000 院(系)电气工程学院 指导教师××

完成时间 2013年12月17日

目录 1、课程设计的目的 (1) 2、课程设计的任务与要求 (2) 2.1实验器材 (2) 2.2电子器件的识别 (2) 2.3焊接技术 (2) 2.4元器件安装及要求: (3) 3、设计方案与论证 (3) 3.1功能分析与具体要求 (3) 3.2设计思路 (4) 4、设计原理及功能说明 (4) 5、单元电路的设计(计算与说明) (6) 6、硬件的制作与调试 (7) 7、总结 (10) 参考文献: (12)

附录1:总体电路原理图.......................错误!未定义书签。附录2:元器件清单.. (14)

1、课程设计的目的 当今世界,彩灯已经成为我们生活的一部分,能给我们带来视觉上的享受还能美化我们的环境。街角巷里,高楼大厦无处不是因它炫彩夺目以及控制简单等特点而得到了广泛的应用,用LED彩灯来装饰街道和城市建筑已经成为一种潮流。发光二极管简称为LED。它是一种能发光的半导体电子元件。这种电子元件早在1962年出现,早期只能发出低光度的红光,之后发展出其他单色光的版本,时至今日能发出的光已遍及可见光、红外线及紫外线,光度也提高到相当的光度。具有效率高、寿命长、不易破损、开关速度高、高可靠性等传统光源不及的优点。白光LED的发光效率,在近几年来已经有明显的提升。因此人们现在更侧重于用LED来照明以及装饰屋内及屋外环境,LED广泛应用与生活的各个方面,不断走进人们的生活也不断地改变着人们的生活。 本实验主要是结合我们以往所学课程的基础理论、基本技能和专业知识的能力,不仅要考虑总体电路的设计还要考虑系统各部分电路的选择、设计及它们之间的相互连接。主要目的是在实践中逐步培养我们建立正确的设计思想,掌握工程设计的一般程序、规范和方法。 (1)了解各种元器件的性能、作用和工作原理; (2)掌握一定的焊接技术以及简单元器件装配; (3)学习印刷电路板;

链表实现多项式相加实验报告

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间:2012年10月17日

1、实验目的和要求 1)掌握链表的运用方法; 2)学习链表的初始化并建立一个新的链表; 3)知道如何实现链表的插入结点与删除结点操作; 4)了解链表的基本操作并灵活运用 2、实验内容 1)建立两个链表存储一元多项式; 2)实现两个一元多项式的相加; 3)输出两个多项式相加后得到的一元多项式。 3、算法基本思想 数降序存入两个链表中,将大小较大的链表作为相加后的链表寄存处。定义两个临时链表节点指针p,q,分别指向两个链表头结点。然后将另一个链表中从头结点开始依次与第一个链表比较,如果其指数比第一个小,则p向后移动一个单位,如相等,则将两节点的系数相加作为第一个链表当前节点的系数,如果为0,则将此节点栓掉。若果较大,则在p前插入q,q向后移动一个,直到两个链表做完为止。 4、算法描述 用链表实现多项式相加的程序如下: #include #include #include struct node{ int exp; float coef; struct node*next; };

void add_node(struct node*h1,struct node*h2); void print_node(struct node*h); struct node*init_node() { struct node*h=(struct node*)malloc(sizeof(struct node)),*p,*q; int exp; float coef=1.0; h->next=NULL; printf("请依次输入多项式的系数和指数(如:\"2 3\";输入\"0 0\"时结束):\n"); p=(struct node*)malloc(sizeof(struct node)); q=(struct node*)malloc(sizeof(struct node)); for(;fabs(coef-0.0)>1.0e-6;) { scanf("%f %d",&coef,&exp); if(fabs(coef-0.0)>1.0e-6) { q->next=p; p->coef=coef; p->exp=exp; p->next=NULL; add_node(h,q); } } free(p); free(q); return(h); } void add_node(struct node*h1,struct node*h2) { struct node*y1=h1,*y2=h2; struct node*p,*q; y1=y1->next; y2=y2->next; for(;y1||y2;) if(y1) { if(y2) { if(y1->expexp) y1=y1->next; else if(y1->exp==y2->exp) { y1->coef+=y2->coef; if(y1->coef==0)

链表实验报告

链表实验报告

————————————————————————————————作者: ————————————————————————————————日期:

《数据结构》实验报告二 系别:嵌入式系统工程系班级:嵌入式11003班 学号:11160400314姓名:孙立阔 日期:2012年4月9日指导教师:申华 一、上机实验的问题和要求: 单链表的查找、插入与删除。设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个字符,产生不带表头的单链表,并输入结点值。 2.从键盘输入1个字符,在单链表中查找该结点的位置。若找到,则显示“找到了”;否则, 则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出单链表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。 5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结 点值,观察输出结果。 6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。 7.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素, 而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。 二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 创建一个空的单链表,实现对单链表的查找,插入,删除的功能。 三、源程序及注释: #defineOK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define TRUE 1

基于plc设计的彩灯循环课程设计论文

专科课程设计(论文)设计题目:基于PLC设计的彩灯循环 系部:电气工程系 专业:电气工程及其自动化 班级:电气自动化111302

摘要 可编程控制器是60年代末在美国首先出现的,当时叫可编程逻辑控制器PLC(ProgrammableLogicController),目的是用来取代继电器。以执行逻辑判断、计时、计数等顺序控制功能。提出PLC概念的是美国通用汽车公司。PLC的基本设计思想是把计算机功能完善、灵活、通用等优点和继电器控制系统的简单易懂、操作方便、价格便宜等优点结合起来,控制器的硬件是标准的、通用的。根据实际应用对象,将控制内容编成软件写入控制器的用户程序存储器内,使控制器和被控对象连接方便。 70年代中期以后,PLC已广泛地使用微处理器作为中央处理器,输入输出模块和外围电路也都采用了中、大规模甚至超大规模的集成电路,这时的PLC 已不再是仅有逻辑(Logic)判断功能,还同时具有数据处理、PID调节和数据通信功能。国际电工委员会(IEC)颁布的可编程控制器标准草案中对可编程控制器作了如下的定义:可编程控制器是一种数字运算操作的电子系统,专为在工业环境下应用而设计。它采用了可编程序的存储器,用来在其内部存储执行逻辑运算,顺序控制、定时、计数和算术运算等操作的指令,并通过数字式和模拟式的输入和输出,控制各种类型的机械或生产过程。可编程控制器及其有关外围设备,易于与工业控制系统联成一个整体,易于扩充其功能的设计。 可编程控制器对用户来说,是一种无触点设备,改变程序即可改变生产工艺。目前,可编程控制器已成为工厂自动化的强有力工具,得到了广泛的普及推广应用。 可编程控制器是面向用户的专用工业控制计算机,具有许多明显的特点。 ①可靠性高,抗干扰能力强; ②编程直观、简单; ③适应性好; ④功能完善,接口功能强。 \

单链表的插入和删除实验报告

. 实验一、单链表的插入和删除 一、目的 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 二、要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 三、程序源代码 #include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedef struct node //定义结点 { char data[10]; //结点的数据域为字符串 struct node *next; //结点的指针域 }ListNode; typedef ListNode * LinkList; // 自定义LinkList单链表类型 LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表

ListNode *LocateNode(); //函数,按值查找结点 void DeleteList(); //函数,删除指定值的结点void printlist(); //函数,打印链表中的所有值 void DeleteAll(); //函数,删除所有结点,释放内存 //==========主函数============== void main() { char ch[10],num[10]; LinkList head; head=CreatListR1(); //用尾插入法建立单链表,返回头指针printlist(head); //遍历链表输出其值 printf(" Delete node (y/n):");//输入“y”或“n”去选择是否删除结点scanf("%s",num); if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){ printf("Please input Delete_data:"); scanf("%s",ch); //输入要删除的字符串 DeleteList(head,ch); printlist(head); } DeleteAll(head); //删除所有结点,释放内存 } //==========用尾插入法建立带头结点的单链表

数据结构树的实现实验报告

数据结构设计性实验报告 课程名称_____ ____ 题目名称 学生学院 专业班级 学号 学生姓名 指导教师 2010 年 7 月 6 日

抽象数据类型:树的实现 一.需求分析 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,直观来看,树是以分支关系定义的内部结构。树的结构在客观世界广泛存在,如人类社会的族谱和各种社会组织机构都可以用树来形象表示。树在计算机领域中也得广泛应用,如在编译程序中,可用树来表示源程序的语法结构,又如在数据库系统中,树形结构也是信息的重要组织形式之一。 二.实验目的 对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。进而达到熟练地运用本课程中的基础知识及技术的目的。 三.实验环境 1、硬件:PC机 2、软件:Microsoft Visual C++ 6.0 四.设计说明 本程序采用树的二叉链表(孩子指针-兄弟指针-双亲指针)存储表示,以下是树的结构定义和基本操作: ADT Tree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R: 若D为空集,则称为空树; 若D仅含有一个数据元素,则R为空集,否则R={H},H是如下二元关系: (1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2) 若D-{root}≠NULL,则存在D-{root}的一个划分D1,D2,D3, …,Dm(m>0),对于任意j ≠k(1≤j,k≤m)有Dj∩Dk=NULL,且对任意的i(1≤i≤m),唯一存在数据元素xi∈Di有∈H; (3) 对应于D-{root}的划分,H-{,…,}有唯一的一个划分H1,H2,…,Hm(m>0),对任意j≠k(1≤j,k≤m)有Hj∩Hk=NULL,且对任意i(1≤i≤m),Hi是Di 上的二元关系,(Di,{Hi})是一棵符合本定义的树,称为根root的子树。 基本操作P: InitTree(&T); 操作结果:构造空树T。 DestroyTree(&T); 初始条件:树T存在。 操作结果:销毁树T。 CreateTree(&T,definition); 初始条件:definition给出树T的定义。 操作结果:按definition构造树T。 ClearTree(&T);

循环彩灯课程设计知识讲解

循环彩灯课程设计

精品资料 成绩 课程设计说明书 题目:循环彩灯电路设计 课程名称:数字电子技术学 院:电子信息与电气工程学院 学生姓名:李倩 学号: 201102020025 专业班级:电子信息工程2011级1班 指导教师:翟亚芳 2013 年6 月7 日

课程设计任务书

循环彩灯 摘要:设计制作了一个循环彩灯控制电路,该电路可以控制8个彩灯从左到右依次点亮,然后依次熄灭,点亮和熄灭的时间间隔为1秒。电路主要由555定时器、同步十六进制加法计数器74LS161和8位串行输入、并行输出移位寄存器74LS164以及2输入端4与非门74LS00组成。555定时器可以产生振荡周期为1秒的时钟信号;74LS161对时钟信号进行加法计数;74LS00对74LS161产生的信号进行取反,74LS164对 74LS00输出的信号移位寄存输出并驱动对应的发光二极管工作,使其可以达到可以依次点亮依次熄灭的目的。 关键词:555定时器;加法计数器;反相器;移位寄存器;

目录 1.设计背景 (1) 1.1 了解数字电路系统和数字电路的定义和组成 (1) 1.2掌握时钟电路的作用及基本构成 (1) 2.设计方案 (1) 2.1 任务分析…………………………………………………………………… 1 2.2方案论证 (2) 3.方案实施 (2) 3.1 原理图设计………………………………………………………………… 2 3.2电路仿真 (4) 3.3PCB制作 (5) 3.4安装与调试 (6) 4.结果与结论 (6) 5.收获与致谢 (6) 6.参考文献 (7) 7.附件 (7) 7.1电路原理图 (8) 7.2仿真图 (8) 7.3P C B布线图 (9)

C语言链表实验报告

链表实验报告 一、实验名称 链表操作的实现--学生信息库的构建 二、实验目的 (1)理解单链表的存储结构及基本操作的定义 (2)掌握单链表存储基本操作 (3)学会设计实验数据验证程序 【实验仪器及环境】计算机 Window XP操作系统 三、实验内容 1、建立一个学生成绩信息(学号,姓名,成绩)的单链表,按学号排序 2、对链表进行插入、删除、遍历、修改操作。 3、对链表进行读取(读文件)、存储(写文件) 四、实验要求 (1)给出终结报告(包括设计过程,程序)-打印版 (2)对程序进行答辩

五、实验过程、详细内容 1、概念及过程中需要调用的函数 (1)链表的概念结点定义 结构的递归定义 struct stud_node{ int num; char name[20]; int score; struct stud_node *next; }; (2)链表的建立 1、手动输入 struct stud_node*Create_Stu_Doc() { struct stud_node *head,*p; int num,score; char name[20]; int size=sizeof(struct stud_node); 【链表建立流程图】

2、从文件中直接获取 先建立一个 (3)链表的遍历 (4 )插入结点 (5)删除结点 (6)动态储存分配函数malloc () void *malloc(unsigned size) ①在内存的动态存储区中分配一连续空间,其长度为size ②若申请成功,则返回一个指向所分配内存空间的起始地址的指针 ③若申请不成功,则返回NULL (值为0) ④返回值类型:(void *) ·通用指针的一个重要用途 ·将malloc 的返回值转换到特定指针类型,赋给一个指针 【链表建立流程图】 ptr ptr ptr->num ptr->score ptr=ptr->next head pt r s s->next = ptr->next ptr->next = s 先连后断 ptr2=ptr1->next ptr1->next=ptr2->next free (ptr2)

循环彩灯课程设计

成绩 课程设计说明书 题目:循环彩灯电路设计 课程名称:数字电子技术 学院:电子信息与电气工程学院 学生姓名:李倩 学号:201102020025 专业班级:电子信息工程2011级1班 指导教师:翟亚芳 2013 年6 月7 日

课程设计任务书设计题目循环彩灯 学生姓名李倩所在学院电子信息与电气工 程学院 专业、年级、班 电子信息工程 2011级1班 设计要求: 1、设计制作一个循环彩灯电路; 2、设置彩灯数量为8个,8个彩灯从左到右依次点亮,然后依次熄灭,点亮和熄灭的时间间隔为1秒。 学生应完成的工作: 设计循环彩灯的工作原理,并利用Multisim软件进行电路仿真。利用DXP软件绘制电路原理图,并设计制作电路的PCB板。根据设计原理对电路进行安装调试,完成课程设计工作,并提交课程设计报告。 参考文献: [1]童诗白.模拟电子技术基础[M].北京:高等教育出版社,2005. [2]臧春华.电子线路设计与应用[M].北京:高等教育出版社,2005. [3]邱关源,罗先觉.电路(第五版)[M].北京:高等教育出版社,2006. [4]阎石.数字电子技术(第五版)[M].北京:高等教育出版社,2005. [5]张阳天,韩异凡.Protel DXP电路设计[M].北京:高等教育出版社,2005. 工作计划: 5月27号—30完成原理图设计;5月31号进行PCB设计;6月3号到4号制作PCB板;6月5到7号电路板安装与调试,提交课程设计报告。 任务下达时期:2013 年5月27日 任务完成时期:2013年6月7 日 指导教师(签名):学生(签名):

循环彩灯 摘要:设计制作了一个循环彩灯控制电路,该电路可以控制8个彩灯从左到右依次点亮,然后依次熄灭,点亮和熄灭的时间间隔为1秒。电路主要由555定时器、同步十六进制加法计数器74LS161和8位串行输入、并行输出移位寄存器74LS164以及2输入端4与非门74LS00组成。555定时器可以产生振荡周期为1秒的时钟信号;74LS161对时钟信号进行加法计数;74LS00对74LS161产生的信号进行取反,74LS164对74LS00输出的信号移位寄存输出并驱动对应的发光二极管工作,使其可以达到可以依次点亮依次熄灭的目的。 关键词:555定时器;加法计数器;反相器;移位寄存器;

链表基本操作实验报告

实验2 链表基本操作实验 一、实验目的 1. 定义单链表的结点类型。 2. 熟悉对单链表的一些基本操作和具体的函数定义。 3. 通过单链表的定义掌握线性表的链式存储结构的特点。 二、实验内容与要求 该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。 要求: 同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。 三、 算法分析与设计。 头结点 ......

2.单链表插入 s->data=x; s->next=p->next; p->next=s; 3.单链表的删除: p->next=p->next->next;

四、运行结果 1.单链表初始化 2.创建单链表 3.求链表长度 4.检查链表是否为空 5.遍历链表 6.从链表中查找元素 7.从链表中查找与给定元素值相同的元素在顺序表中的位置

8.向链表中插入元素 插入元素之后的链表 9.从链表中删除元素 删除位置为6的元素(是3) 10.清空单链表 五、实验体会 经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程序做了仔细的分析,对单链表创建、插入、删除算法画了详细的N-S流程图。

六路彩灯循环控制器数电课程设计

一.设计目的及要求 1.1 课程设计的目的 1 、巩固和加强《数字电子技术》课程的理论知识。 2 、掌握电子电路的一般设计方法,了解电子产品研制开发过程。 3 、掌握电子电路安装和调试的方法及其故障排除方法,学会用ewb 软件或multisim 软件对电路仿真。 4 、通过查阅手册和文献资料,培养独立分析问题和解决问题的能力。 5、培养创新能力和创新思维。 1.2 要求 用中规模集成电路实现6 路彩灯控制电路,主要用计数器、译码器、移位寄存器等芯片集成,实现以下5 种演示花型: 花型1:6 路彩灯同时亮; 花型2:6 路彩灯同时灭; 花型3:6 路彩灯从左至右逐路点亮; 花型4:6 路彩灯左侧三个全亮,同时右侧三个全灭; 花型5; 6 路彩灯右侧三个全亮,同时左侧三个全灭; 要求彩灯亮、灭一次的时间可调,花型转换的顺序为:花型1、花型2、花型3 、花型4,花型5 、花型1 电路有复位控制,复位按钮闭合时彩灯循环输出,按钮断开彩灯熄灭。 二、设计方案的选择和电路框图

2.1题目分析 我们设计的流水灯实际上是主要使用一个555定时器、一个 74LS160,—个74LS42和两个74HC194这四个芯片对,6个彩灯进行控制,产生循环控制的效果。 2.2 题目设计 花型1,111111 ;花型2,000000 ;花型3,100000 ——010000 ——001000——000100——000010——000001;花型4,111000 ;花型5,000111。用74HC194移位寄存器来实现。用74LS42译码器来实现对194的控制,实现194的清零,并行输入,以及右移。用 74LS160十进制计数器控制42译码器的输出,555定时器根据滑动电阻的调节来实现输出时钟脉冲周期的不同从而控制160 计数的快慢,也就实现了彩灯闪烁时间的可调。 2.3结构框图

链表的基本操作-数据结构实验报告

大学数据结构实验报告 课程名称数据结构实验第(四)次实验实验名称链表的基本操作 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期2018年10月01日 一、实验目的 1. 学会定义单链表的结点类型,实现对单链表的一些基本操作和具体 的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2. 掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La (2)在La中插入一个新结点 (3)删除La中的某一个结点 (4)在La中查找某结点并返回其位置 (5)打印输出La中的结点元素值 (6)清空链表 (7)销毁链表 2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、 Lb合并成一个有序单链表Lc。 四、思考与提高: 1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作? 2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?五、实验设计 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La LinkList InitList() {

int i,value,n; LinkList H=(LinkList)malloc(sizeof(LNode)); LinkList P=H; P->next=NULL; do{ printf("请输入链表的长度:"); scanf("%d",&n); if(n<=0) printf("输入有误请重新输入!\n"); }while(n<=0); printf("请输入各个元素:\n"); for(i=0; idata=value; P->next=NEW; NEW->next=NULL; P=NEW; } printf("链表建立成功!\n"); return H->next; } (2)在La中插入一个新结点 LinkList InsertList(LinkList L,int i,ElemType value) { LinkList h,q,t=NewLNode(t,value); int x=0; h=q=L; if(i==1) t->next=h, h=t; else { while(x++next; t->next=q->next; q->next=t; } printf("插入成功!\n"); return h; } (3)删除La中的某一个结点

链表基本操作实验报告

实验2 链表基本操作实验 一、实验目的 1. 定义单链表的结点类型。 2. 熟悉对单链表的一些基本操作和具体的函数定义。 3. 通过单链表的定义掌握线性表的链式存储结构的特点。 二、实验容与要求 该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。 要求: 同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。 三、 算法分析与设计。 头结点

2.单链表插入 s->data=x; s->next=p->next; p->next=s; 3.单链表的删除: p->next=p->next->next;

四、运行结果 1.单链表初始化 2.创建单链表 3.求链表长度 4.检查链表是否为空 5.遍历链表 6.从链表中查找元素 7.从链表中查找与给定元素值相同的元素在顺序表中的位置

8.向链表中插入元素 插入元素之后的链表 9.从链表中删除元素 删除位置为6的元素(是3) 10.清空单链表 五、实验体会 经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程序做了仔细的分析,对单链表创建、插入、删除算法画了详细的N-S流程图。

用单链表实现集合的操作

《数据结构》课设计报告 2012—2013学年第一学期 课程名称数据结构 设计题目用单链表实现集合的操作 专业班级 姓名 学号 指导教师 一.实验目的

掌握单链表的算法,插入、删除、遍历等。 二.实验内容 (1)对集合中的元素用有序单链表进行存储; (2)实现交、并、差等基本运算时,不能另外申请存储空间; (3)充分利用单链表的有序性,要求算法有较好的时间性能。 三.设计与编码 集合是由互不相同的元素构成的一个整体,在集合中,元素之间可以没有任何关系,所以,集合也可以作为线性表的处理。用单链表实现集合的操作,需要注意集合中元素的唯一性,即在单链表中不存在值相同的结点。 (1)判断A和B是否相等。两个集合相等的条件是不仅长度相同,而且各个对应的元素也相等。由于用单链表表示集合,所以只要同步搜啊秒两个单链表,若从头至尾每个对应的元素都相等,则表明两个集合相等。 (2)求集合A和B的交集。根据集合的运算规则,集合A∩B中包含所有既属于集合A又属于集合B的元素,因此,需要查找单链表A和B中的相同元素并保留在单链表A中。由于用有序单链表表示集合,因此判断某元素是否在B中不需要遍历表B,而是从上次搜索到的位置开始,若在搜索过程中,遇到一个其值比该元素大的结点,便可断定该元素不在单链表中,为此,需要用两个指针p、q分别指向当前被比较的两个结点,会出现以下三种情况: 1、若p->data>q->data,说明还未找到,需在表B中继续查找; 2、若p->datadata,说明表B中无此值,处理表A中下一结点; 3、若p->data=q->data,,说明找到了公共元素。 (3)求集合A和B的并集,集合A∪B中包含所有或属于集合A或属于集合B 的元素。因此,对单链表B中的每一个元素x,在单链表A中进行查找,若存在和x不同的元素,则将该结点出入到单链表A中。 (4)求集合A和B的差集。根基集合的运算规则,集合A-B中包含所有属于集合A而不属于集合B的元素。因此,对单链表B中的每个元素x在单链表A中进行查找,若存在和x相同的结点,则将该结点从链表A中删除。 在主函数中,首先建立两个有序单链表表示集合A和B,然后依次调用相应函数实现集合的判等、交、并和差等运算,并输出运算结果。 代码: #include using namespace std; template struct Node{ T data; Node *next; }; template class LinkList{ public:

相关主题
文本预览
相关文档 最新文档