数据结构实验一

实验一第1题

#include
#include
#include
#include
typedef struct Node
{
    int data;
    struct Node *next;
}Node,*Linklist;
Linklist CreateFromTail(Linklist L)
{//尾插法创建链表
    Node *r,*s;
    int flag=1;
    int c;
    r=L;
    while(flag)
    {   c=getchar();
        if(c!='$')
        {
            s=(Node*)malloc(sizeof(Node));
            s->data=c;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;
        }
    }


}
void DisplayLinklist(Linklist L)
{//显示链表
   Node *q,*p;
   q=L->next;
   p=L;
    while(p->next!=NULL)
    {
        printf("%c ",q->data);
        p=p->next;
        q=q->next;
    }

}
void DeleteLinklist(Linklist L,char n)
{//删除值为n的结点
    Node *h,*r;
    h=L->next;
    r=L;
    while(r->next!=NULL)
    {
        if(h->data==n)
            {
            r->next=h->next;
            h=h->next;
            }
        else
            {
            r=r->next;
            h=h->next;
            }
    }


}
void main()
{
    printf("输入数据(输入$则结尾)和要删除结点的值x\n");
    char x;
    Linklist L=(Node*)malloc(sizeof(Node));
    L->next=NULL;//初始化链表
    CreateFromTail(L);
    printf("生成链表如下:\n");
    DisplayLinklist(L);
    x=getchar();
    DeleteLinklist(L,x);
    printf("\n删除x后的链表如下:\n");
    DisplayLinklist(L);
    free(L);
    L=NULL;
    system("pause");//让程序不马上退出
    return 0;
}

实验一第2题

#include
#include
#include
#include
typedef struct Node
{
    int data;
    struct Node *next;
}Node,*Linklist;
Linklist CreateFromTail(Linklist L)
{//尾插法创建链表
    Node *r,*s;
    int flag=1;
    int c;
    r=L;
    while(flag)
    {   c=getchar();
        if(c!='$')
        {
            s=(Node*)malloc(sizeof(Node));
            s->data=c;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;
        }
    }


}
void DisplayLinklist(Linklist L)
{//显示链表
   Node *q,*p;
   q=L->next;
   p=L;
    while(p->next!=NULL)
    {
        printf("%c ",q->data);
        p=p->next;
        q=q->next;
    }

}
Linklist DaozhiLinklist(Linklist L)
{//生成逆序链表
    Linklist d=(Node*)malloc(sizeof(Node));
    d->next=NULL;
    Node *p;
    while(L->next!=NULL)
    {
        L=L->next;
        p=(Node*)malloc(sizeof(Node));
        p->data=L->data;
        p->next=d->next;
        d->next=p;
    }
    return d;
}
void main()
{
    printf("输入数据(输入$则结尾)\n");
    Linklist L=(Node*)malloc(sizeof(Node));
    L->next=NULL;//初始化链表
    CreateFromTail(L);
    printf("逆序前链表如下:\n");
    DisplayLinklist(L);
    Linklist d=DaozhiLinklist(L);
    printf("\n逆序后链表如下:\n");
    DisplayLinklist(d);
    free(L);
    free(d);
    L=NULL;
    d=NULL;
    system("pause");//让程序不马上退出
    return 0;
}

实验一第3题(链式)

#include
#include
#include
#include
typedef struct Node
{
    char data;
    struct Node *next;
}Node,*Linklist;
Linklist CreateFromTail(Linklist L)
{//尾插法创建链表
    Node *r,*s;
    int flag=1;
    int c;
    r=L;
    while(flag)
    {   c=getchar();
        if(c!='$')
        {
            s=(Node*)malloc(sizeof(Node));
            s->data=c;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;
        }
    }


}
void DisplayLinklist(Linklist L)
{//显示链表
   Node *q,*p;
   q=L->next;
   p=L;
    while(p->next!=NULL)
    {
        printf("%c ",q->data);
        p=p->next;
        q=q->next;
    }

}
void DeleteLinklist(Linklist L,char n)
{//删除值为n的结点
    Node *h,*r;
    h=L->next;
    r=L;
    while(r->next!=NULL)
    {
        if(h->data==n)
            {
            r->next=h->next;
            h=h->next;
            }
        else
            {
            r=r->next;
            h=h->next;
            }
    }


}
void QuchongLinklist(Linklist L)
{//去除重复
    Node *a,*b,*c;
    a=L;
    while(a->next!=NULL)
    {
        a=a->next;
        if(a->next!=NULL)
        {
            b=a->next;
            c=a;
        while(b!=NULL)
        {
            if(b->data==a->data)
                {
                    c->next=b->next;
                    b=b->next;
                }
            else
            {
                b=b->next;
                c=c->next;
            }

        }
        }
        else ;

    }

}
Linklist HebingLinklist(Linklist p,Linklist q)
{//并集
    Node *m,*n;
    QuchongLinklist(p);
    QuchongLinklist(q);
    m=p;
    while(m->next!=NULL)
        {
            m=m->next;
            DeleteLinklist(q,m->data);
        };
    Linklist c=p->next;
    while(c->next!=NULL)c=c->next;
    c->next=q->next;
    return p;
}
void main()
{
    printf("输入数据(输入$则结尾)\n");
    Linklist L=(Node*)malloc(sizeof(Node));
    L->next=NULL;//初始化链表
    Linklist N=(Node*)malloc(sizeof(Node));
    N->next=NULL;//初始化链表
    CreateFromTail(L);
    CreateFromTail(N);
    printf("链表a如下:\n");
    DisplayLinklist(L);
    printf("\n链表b如下:\n");
    DisplayLinklist(N);
    printf("\na、b的并集链表c如下:\n");
    Linklist c=HebingLinklist(L,N);
    DisplayLinklist(c);
    free(L);
    free(N);
    free(c);
    L=NULL;
    N=NULL;
    c=NULL;
    system("pause");//让程序不马上退出
    return 0;
}

实验一第3题(顺序)

#include
#include
typedef struct
{
    int *elem;
    int last;
}SeqList;
int isExist(SeqList l, int x)//判断元素x是否存在于表中
{
    int i = 0;
    while (i < l.last)
    {
        if (l.elem[i] == x)
            break;
        i++;
    }
    if (i == l.last)
        return 0;
    return 1;
}

SeqList bingList(SeqList x, SeqList y)//求x,y的并集
{
    SeqList L;
    int i;
    L.elem=(int*)malloc(sizeof(int)*(x.last + y.last));
    L.last = 0;
    for (i = 0;i < x.last;i++)
    {
        if (!isExist(L, x.elem[i]))
        {
            L.elem[L.last] = x.elem[i];
            L.last++;
        }
    }
    for (i = 0;i < y.last;++i)
    {
        if (!isExist(L, y.elem[i])){
            L.elem[L.last] = y.elem[i];
            L.last++;
        }
    }
    return L;//返回并集
}
int fun(int a[]){//初始化函数
    int i=0;
    printf("输入整型数据,以回车结束\n");
    do{
        scanf("%d",&a[i]);
        i++;
    }while(getchar()!='\n');
    return i;
}

int main()
{
    SeqList A,B;
    int i;
    int a[100],b[100];
    A.last=fun(a);
    A.elem=a;
    B.last=fun(b);
    B.elem=b;
    SeqList x=bingList(A, B);
    printf("并集为:\n");
    for (i = 0;i < x.last;i++)
        printf("%d ", x.elem[i]);
    return 0;
}

实验一第4题

#include
#include
typedef struct Node
{
    int data;
    struct Node *next;
}Node,*Linklist;
void main()
{
    Linklist p,rear,head;
    int m,n,king,i,j;
    scanf("%d %d",&m,&n);
    if(m==1)
       king=1;//一只猴子时不用循环
    p=rear=(Node*)malloc(sizeof(Node));
    head=p;
    head->data=1;
    for(i=1;i     {
        p=(Node*)malloc(sizeof(Node));
        p->data=i+1;
        rear->next=p;
        rear=p;
    }
    rear->next=head;
    p=head;
    for(i=1;i     {
        for(j=1;j             p=p->next;
            rear=p->next;//找到报数n的猴子
            p->next=rear->next;//删掉那个猴子
            p=rear->next;
            free(rear);
    }
    king=p->data;
    free(p);
    printf("猴王原始序号为%d\n",king);
    system("pause");
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟大帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值