大二上数据结构课程设计

数据结构课程设计

数据结构刚刚结束,暂时先将我写的几道题发一下,后续有时间我再进行更新
(一)线性结构(链表)题目

在这里插入图片描述

#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
*/

  • 20
    点赞
  • 228
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值