数据结构课程设计
数据结构刚刚结束,暂时先将我写的几道题发一下,后续有时间我再进行更新
(一)线性结构(链表)题目
#include <bits/stdc++.h>
using namespace std;
struct node
{
int data,password;
struct node *next;
}*head,*exm,*last,*pre;
int main()
{
int m,n,x;
printf("请输入m初始值:\n");
scanf("%d",&m);
printf("请输入参与游戏总人数n:\n");
scanf("%d",&n);
printf("请依次输入游戏参与者的密码:\n");
head=new node;
last=head;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
exm=new node;
exm->data=i;
exm->password=x;
last->next=exm;
last=exm;
}
exm->next=head->next;
pre=exm;
exm=exm->next;
x=0;
printf("出列顺序为:\n");
while(exm->next!=exm)
{
x++;
if(x==m)
{
printf("%d ",exm->data);
m=exm->password;
pre->next=exm->next;
exm=exm->next;
x=0;
continue;
}
pre=exm;
exm=exm->next;
}
printf("%d\n",exm->data);
return 0;
}
(二)栈和队列题目
#include <bits/stdc++.h>
using namespace std;
struct zuobiao
{
int x,y;
}in,out,pap,use;
struct node
{
struct zuobiao z;
struct node *next,*front;
}*head,*last,*qaq;
int x3[4]={0,0,1,-1},y3[4]={1,-1,0,0},data[105][1005];
void push(zuobiao a)
{
qaq=new node;
qaq->z=a;
qaq->next=NULL;
qaq->front=last;
last->next=qaq;
last=qaq;
}
zuobiao pop()
{
zuobiao a;
a=last->z;
last=last->front;
return a;
}
int main()
{
int n,m,exm,eym,a,t=0;
printf("请输入要设置的迷宫行数:\n");
scanf("%d",&n);
printf("请输入要设置的迷宫列数:\n");
scanf("%d",&m);
printf("请输入迷宫(墙为0,通道为1):\n");
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
scanf("%d",&a);
if(a)
a=INT_MAX;
data[i][j]=a;
}
printf("请输入迷宫入口坐标:\n");
scanf("%d%d",&in.x,&in.y);
printf("请输入迷宫出口口坐标:\n");
scanf("%d%d",&out.x,&out.y);
head=new node;
last=new node;
last->z=in;
last->next=NULL;
last->front=head;
head->next=last;
data[in.x][in.y]=1;
if(data[out.x][out.y]==0)
printf("对不起,您设置的迷宫没有出路,迷宫图如下\n");
while(last!=head) {
pap=pop();
for(int i=0;i<4;i++) {
exm=pap.x+x3[i];
eym=pap.y+y3[i];
if(data[exm][eym]&&exm>0&&exm<11&&eym>0&&eym<11) {
if(exm==out.x&&eym==out.y)
t=1;
a=data[pap.x][pap.y]+1;
if(a<data[exm][eym]){
data[exm][eym]=a;
use.x=exm;
use.y=eym;
push(use);
}
}
}
}
if(t) {
printf("已找到最短出路,迷宫出路用⊙表示,如下图\n");
a=data[out.x][out.y];
int b=a;
pap=out;
for(int i=a;i>0;i--) {
data[pap.x][pap.y]=-1;
for(int i=0;i<4;i++) {
exm=pap.x+x3[i];
eym=pap.y+y3[i];
if(data[exm][eym]==b-1) {
b--;
pap.x=exm;
pap.y=eym;
break;
}
}
}
}
else
printf("对不起,您设置的迷宫没有出路,迷宫图如下\n");
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(data[i][j]==0)
printf("■");
else if(data[i][j]==-1)
printf("⊙");
else
printf(" ");
}
printf("\n");
}
return 0;
}
/*
样例:
12
11
0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 1 1 1 0 0 0 0
0 1 1 1 1 0 1 0 0 0 0
0 1 0 0 0 0 1 0 0 0 0
0 1 0 1 1 1 1 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0
0 1 0 1 1 1 1 1 0 0 0
0 1 1 0 0 0 0 1 0 0 0
0 0 1 0 0 1 1 1 0 0 0
0 1 1 0 0 1 0 1 1 1 0
0 1 0 0 0 1 1 1 0 1 0
0 0 0 0 0 0 0 0 0 1 0
2 1
12 10
*/
(三)树型结构题目
#include <bits/stdc++.h>
using namespace std;
struct node
{
char data;
int num,num1;
struct node *lchild,*rchild;
}*gen,*exm;
struct nodf
{
node *element;
struct nodf *next;
}*head,*eym,*last,*pap;
int maxi=0,n;
void solve(node *qaq,string str1,string str2,int x,int y)
{
int i=0;
maxi=max(maxi,x);
string a,b,c,d;
while(str2[i]!=qaq->data)
i++;
a=str2.substr(0,i);
b=str2.substr(i+1,str2.length()-1-i);
if(a.length())
{
c=str1.substr(1,a.length());
exm=new node;
exm->data=c[0];
exm->num=x;
exm->num1=2*y-1;
exm->lchild=exm->rchild=NULL;
qaq->lchild=exm;
solve(exm,c,a,x+1,2*y-1);
}
if(b.length())
{
d=str1.substr(a.length()+1,b.length());
exm=new node;
exm->data=d[0];
exm->num=x;
exm->num1=2*y;
exm->lchild=exm->rchild=NULL;
qaq->rchild=exm;
solve(exm,d,b,x+1,2*y);
}
}
void push(node *qaq)
{
pap=new nodf;
pap->element=qaq;
pap->next=NULL;
last->next=pap;
last=pap;
}
void cengxu()
{
printf("\n该二叉树的层序序列为:\n");
while(head!=last) {
head=head->next;
exm=head->element;
if(exm->lchild)
push(exm->lchild);
if(exm->rchild)
push(exm->rchild);
printf("%c ",exm->data);
}
printf("\n");
}
void houxu(node *qaq){
if(qaq->lchild)
houxu(qaq->lchild);
if(qaq->rchild)
houxu(qaq->rchild);
printf("%c ",qaq->data);
}
int main()
{
string str1,str2;
char x;
printf("请输入二叉树的先序序列:\n");
cin>>str1;
printf("请输入二叉树的中序序列:\n");
cin>>str2;
if(str1.length()!=str2.length())
printf("抱歉,你输入的序列无法构成二叉树\n");
else {
x=str1[0];
gen=new node;
gen->data=x;
gen->num=1;
gen->lchild=gen->rchild=NULL;
solve(gen,str1,str2,1,1);
head=new nodf;
last=head;
push(gen);
cengxu();
printf("该二叉树的后序序列为:\n");
houxu(gen);
printf("\n");
}
return 0;
}
(四)图型结构题目
#include <bits/stdc++.h>
using namespace std;
struct line
{
int data,type,value;
struct line *next;
}*able;
struct node
{
int cost,judge,mini;
struct line *to;
}*spot;
int n,m,t,a,b,c;
void solve(int x,int jilu)
{
int vis;
line *exm;
exm=(spot+x)->to;
while(exm)
{
if(exm->type)
{
vis=(spot+x)->cost-jilu*jilu+(jilu+exm->value)*(jilu+exm->value);
(spot+exm->data)->mini=min((spot+exm->data)->mini,vis);
if(vis<(spot+exm->data)->cost)
{
(spot+exm->data)->cost=vis;
//printf("%d=%d\n",exm->data,(spot+exm->data)->cost);
(spot+exm->data)->judge=1;
solve(exm->data,jilu+exm->value);
}
}
else
{
vis=(spot+x)->cost+exm->value;
(spot+exm->data)->mini=min((spot+exm->data)->mini,vis);
if(vis<=(spot+exm->data)->cost)
{
(spot+exm->data)->cost=vis;
(spot+exm->data)->judge=0;
//printf("%d=%d\n",exm->data,(spot+exm->data)->cost);
solve(exm->data,0);
}
else if((spot+exm->data)->judge&&exm->data!=n&&exm->data!=1)
{
(spot+exm->data)->cost=vis;
(spot+exm->data)->judge=0;
//printf("%d=%d\n",exm->data,(spot+exm->data)->cost);
solve(exm->data,0);
}
}
exm=exm->next;
}
}
int main()
{
scanf("%d%d",&n,&m);
spot=new node[n+1];
for(int i=1;i<=n;i++)
{
(spot+i)->to=NULL;
(spot+i)->cost=(spot+i)->mini=INT_MAX;
(spot+i)->judge=0;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&t,&a,&b,&c);
able=new line;
able->data=b;
able->type=t;
able->value=c;
able->next=(spot+a)->to;
(spot+a)->to=able;
able=new line;
able->data=a;
able->type=t;
able->value=c;
able->next=(spot+b)->to;
(spot+b)->to=able;
}
(spot+1)->cost=(spot+1)->mini=0;
solve(1,0);
for(int i=1;i<=n;i++)
printf("到%d路口的最小疲劳度为:%d\n",i,(spot+i)->mini);
free(spot);
return 0;
}
/*
6 7
1 1 2 3
1 2 3 2
0 1 3 30
0 3 4 20
0 4 5 30
1 3 5 6
1 5 6 1
*/
(五)查找、排序、文件
(五)查找、排序、文件
3、散列文件的插入、删除和查找
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
//哈希函数:H(key)=key%17;
struct Node{
int data;
struct Node *next;
}*L,*s,*p;
int mod=17;
void creat() //创建散列表
{
free(L);
L=new Node[20];
for(int i=0;i<20;i++)
(L+i)->next=NULL;
int x,y,i=1,n;
printf("请 输 入 初 始 化 元 素 个 数:\n");
cin>>n;
printf("请 输 入 初 始 化 元 素 序 列:\n");
while(i<=n){
cin>>x;
y=x%mod;
s=new Node;
s->data=x;
s->next=NULL;
s->next=(L+y)->next;//头插
(L+y)->next=s;
i++;
}
printf("\n初 始 化 已 完 成 !\n");
}
void push() //插入一个元素
{
int x,y;
cout<<endl<<"请 输 入 想 要 插 入 的 元 素:\n";
cin>>x;
cout<<endl;
y=x%mod;
s=new Node;
s->data=x;
s->next=NULL;
p=(L+y)->next;
while(p!=NULL){
if(p->data==x){
cout<<"该 元 素 已 经 存 在 !\n"<<endl;
break;
}
else
p=p->next;
}
if(p==NULL){
s->next=(L+y)->next;
(L+y)->next=s;
cout<<"已 插 入 该 元 素 !\n"<<endl;
}
}
void findi() //查找一个元素
{
int x,y;
cout<<"请 输 入 想 要 查 找 的 元 素:\n";
cin>>x;
cout<<endl;
y=x%mod;
p=(L+y)->next;
while(p!=NULL){
if(p->data==x){
cout<<"已 找 到 该 元 素 !\n"<<endl;
break;
}
else
p=p->next;
}
if(p==NULL)
cout<<"未 找 到 该 元 素 !\n"<<endl;
}
void dele() //删除一个元素
{
int x,y;
cout<<"请 输 入 想 要 删 除 的 元 素:\n";
cin>>x;
cout<<endl;
y=x%mod;
s=(L+y);
p=(L+y)->next;
while(p!=NULL){
if(p->data==x){
s->next=p->next;
delete(p);
cout<<"已 找 到 元 素 并 删 除 !\n"<<endl;
break;
}
s=p;
p=p->next;
}
if(p==NULL)
cout<<"未 找 到 该 元 素 !\n"<<endl;
}
void print() //输出散列表
{
for(int i=0;i<mod;i++){
cout<<i<<": ";
p=(L+i)->next;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
}
int main()
{
int x;
L=new Node[100];
while(1){
printf("\n\t\t");
for(int i=0;i<10;i++){
printf("★ ☆ ");
}
printf("\n");
printf("\t\t*\t\t\t\t\t\t\t *\n");
printf("\t\t*\t\t 1. 初 始 化 散 列 表 \t\t *\n");
printf("\t\t*\t\t\t\t\t\t\t *\n");
printf("\t\t*\t\t 2. 元 素 插 入 \t\t\t *\n");
printf("\t\t*\t\t\t\t\t\t\t *\n");
printf("\t\t*\t\t 3. 元 素 删 除 \t\t\t *\n");
printf("\t\t*\t\t\t\t\t\t\t *\n");
printf("\t\t*\t\t 4. 元 素 查 找 \t\t\t *\n");
printf("\t\t*\t\t\t\t\t\t\t *\n");
printf("\t\t*\t\t 5. 输 出 散 列 表 \t\t *\n");
printf("\t\t*\t\t\t\t\t\t\t *\n");
printf("\t\t*\t\t 6. 结 束 程 序 \t\t\t *\n");
printf("\t\t*\t\t\t\t\t\t\t *\n\t\t");
for(int i=0;i<10;i++){
printf("★ ☆ ");
}
printf("\n\n\t\t请 输 入 您 的 选 择 < 1 - 6 >:");
scanf("%d",&x);
if(x==1){
creat();system("Pause");system("cls");
}
else if(x==2){
push();system("Pause");system("cls");
}
else if(x==3){
dele();system("Pause");system("cls");
}
else if(x==4){
findi();system("Pause");system("cls");
}
else if(x==5){
print();system("Pause");system("cls");
}
else{
printf("\n\t\t程 序 运 行 结 束 !\n");Sleep(1000);
break;
}
}
return 0;
}
/*
20
2 4 7 9 10 21 37 49 53 34 40 25 27 11 14 19 32 39 87 69
*/