数据结构(李清云)实验二答案

已知不带头结点的链表结构定义及头插法建表、尾插法建表和打印链表等函数定义如下(详见slnklist.h文件),基于该文件完成实验题1~实验题4.

#include <stdio.h>

#include <stdlib.h>

#define maxsize 100

typedef int datatype;

typedef struct link_node{

    datatype info;

    struct link_node *next;

}node;

typedef node *linklist;

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

/*函数名称:creatbystack()                  */

/*函数功能:头插法建立单链表                */

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

linklist creatbystack()

{

    linklist head,s;

    datatype x;

    head=NULL;

    printf("请输入若干整数序列:\n");

    scanf("%d",&x);

    while(x!=0)            /*以0结束输入*/

    {

        s=(linklist)malloc(sizeof(node));  /*生成待插入结点*/

        s->info=x;

        s->next=head;           /*将新结点插入到链表最前面*/

        head=s;

        scanf("%d",&x);

    }

    return head;        /*返回建立的单链表*/

}

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

/*函数名称:creatbyqueue()                  */

/*函数功能:尾插法建立单链表                */

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

linklist creatbyqueue()

{

    linklist head,r,s;

    datatype x;

    head=r=NULL;

    printf("请输入若干整数序列:/n");

    scanf("%d",&x);

    while(x!=0)              /*以0结束输入*/

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        if(head==NULL)       /*将新结点插入到链表最后面*/

            head=s;

        else r->next=s;

        r=s;

        scanf("%d",&x);

    }

    if(r) r->next=NULL;

    return head;           /*返回建立的单链表*/

}

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

/*函数名称:print()                         */

/*函数功能:输入不带头结点的单链表          */

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

void print(linklist head)

{

    linklist p;

    int i=0;

    p=head;

    printf("List is:\n");

    while(p)

    {

        printf("%5d",p->info);

        p=p->next;

        i++;

        if(i%10==0)  printf("\n");

    }

    printf("\n");

}

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

/*函数名称:delList()                       */

/*函数功能:释放不带头结点的单链表                */

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

void delList(linklist head)

{

    linklist p=head;

    while(p)

    {

        head=p->next;

        free(p);

        p=head;

    }

}

(1)编写函数linklist delx(linklist head,datatype x),删除不带头结点单链表head中的第一个值为x的结点,并构造测试用例进行测试(实验代码详见lab2_01.c)

#include <stdio.h>

#include <stdlib.h>

typedef int datatype;

typedef struct link_node{

    datatype info;

    struct link_node *next;

}node;

typedef node *linklist;

linklist creatbystack()

{

    linklist head,s;

    datatype x;

    head=NULL;

    printf("请输入若干整数序列:\n");

    scanf("%d",&x);

    while(x!=0)

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        s->next=head;

        head=s;

        scanf("%d",&x);

    }

    return head;

}

linklist creatbyqueue()

{

    linklist head,r,s;

    datatype x;

    head=r=NULL;

    printf("请输入若干整数序列:\n");

    scanf("%d",&x);

    while(x!=0)

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        if(head==NULL)

            head=s;

        else r->next=s;

        r=s;

        scanf("%d",&x);

    }

    if(r) r->next=NULL;

    return head;

}

void print(linklist head)

{

    linklist p;

    int i=0;

    p=head;

    printf("List is:\n");

    while(p)

    {

        printf("%5d",p->info);

        p=p->next;

        i++;

        if(i%10==0)  printf("\n");

    }

    printf("\n");

}

void delList(linklist head)

{

    linklist p=head;

    while(p)

    {

        head=p->next;

        free(p);

        p=head;

    }

}

linklist delx(linklist head,datatype x)

{

    linklist pre=NULL,p;

    if(!head)

    {

        printf("单链表是空的!");

        return 0;

    }

    p=head;

    while(p&&p->info!=x)

    {

        pre=p;

        p=p->next;

    }

    if(p)

    {

        if(!pre)  head=head->next;

        else pre->next=p->next;

        free(p);

    }

    return head;

}

int main()

{

    datatype x;

    linklist head;

    head=creatbyqueue();

    print(head);

    printf("请输入要删除的值:");

    scanf("%d",&x);

    head=delx(head,x);

    print(head);

    delList(head);

    return 0;

}

(2)假设线性表(a1,a2,a3,……,an)采用不带头结点的单链表存储,请设计算法函数linklist reversel(linklist head)和void reverse2(linklist *head)将不带头结点的单链表head倒置,使表变成(an,an-1,……,a3,a2,a1).并构造测试用例进行测试(实验代码详见lab2_02.c)

#include <stdio.h>

#include <stdlib.h>

#define maxsize 100

typedef int datatype;

typedef struct link_node{

    datatype info;

    struct link_node *next;

}node;

typedef node *linklist;

linklist creatbystack()

{

    linklist head,s;

    datatype x;

    head=NULL;

    printf("请输入若干整数序列:\n");

    scanf("%d",&x);

    while(x!=0)

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        s->next=head;

        head=s;

        scanf("%d",&x);

    }

    return head;

}

linklist creatbyqueue()

{

    linklist head,r,s;

    datatype x;

    head=r=NULL;

    printf("请输入若干整数序列:/n");

    scanf("%d",&x);

    while(x!=0)

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        if(head==NULL)

            head=s;

        else r->next=s;

        r=s;

        scanf("%d",&x);

    }

    if(r) r->next=NULL;

    return head;

}

void print(linklist head)

{

    linklist p;

    int i=0;

    p=head;

    printf("List is:\n");

    while(p)

    {

        printf("%5d",p->info);

        p=p->next;

        i++;

        if(i%10==0)  printf("\n");

    }

    printf("\n");

}

void delList(linklist head)

{

    linklist p=head;

    while(p)

    {

        head=p->next;

        free(p);

        p=head;

    }

}

linklist reversel(linklist head)

{

    linklist p,q;

    p=head;

    if(!p)

    {

        printf("单链表为空,无法倒置");

        return NULL;

    }

    q=head->next;

    while(q!=NULL)

    {

        p->next=q->next;

        q->next=head;

        head=q;

        q=p->next;

    }

    return head;

}

void reverse2(linklist *head)

{

    linklist p,q;

    p=*head;

    q=p->next;

    if(!p)

    {

        printf("单链表为空,无法倒置");

        return NULL;

    }

    while(q!=NULL)

    {

        p->next=q->next;

        q->next=*head;

        *head=q;

        q=p->next;

    }

}

int main()

{

    datatype x;

    linklist head;

    head=creatbystack();

    print(head);

    head=reversel(head);

    print(head);

    reverse2(&head);

    print(head);

    delList(head);

    return 0;

}

(3)假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),将值为x的结点插入到链表head中,并保持链表的有序性。分别构造插入到表头、表中、表尾3种情况的测试样例进行测试。(实验代码详见lab2_03.c)

#include <stdio.h>

#include <stdlib.h>

typedef int datatype;

typedef struct link_node{

    datatype info;

    struct link_node *next;

}node;

typedef node *linklist;

typedef node *linklist;

linklist creatbystack()

{

    linklist head,s;

    datatype x;

    head=NULL;

    printf("请输入若干整数序列:\n");

    scanf("%d",&x);

    while(x!=0)

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        s->next=head;

        head=s;

        scanf("%d",&x);

    }

    return 0;

}

linklist creatbyqueue()

{

    linklist head,r,s;

    datatype x;

    head=r=NULL;

    printf("请输入若干整数序列:\n");

    scanf("%d",&x);

    while(x!=0)

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        if(head==NULL)

            head=s;

        else r->next=s;

        r=s;

        scanf("%d",&x);

    }

    if(r) r->next=NULL;

    return head;

}

void print(linklist head)

{

    linklist p;

    int i=0;

    p=head;

    printf("List is:\n");

    while(p)

    {

        printf("%5d",p->info);

        p=p->next;

        i++;

        if(i%10==0)  printf("\n");

    }

    printf("\n");

}

void delList(linklist head)

{

    linklist p=head;

    while(p)

    {

        head=p->next;

        free(p);

        p=head;

    }

}

linklist insert(linklist head,datatype x)

{

    linklist p,pre,s,r;

    pre=NULL;p=head;

    if(!p)

    {

        printf("单链表为空,无法插入");

        return NULL;

    }

    s=(linklist)malloc(sizeof(node));

    s->info=x;

    s->next=NULL;

    while(p && p->info<x)

    {

        pre=p;

        p=p->next;

    }

    if(p)

    {

        if(!pre)

        {

            s->next=p;

            head=s;

        }

        else{

            s->next=p;

            pre->next=s;

        }

    }

    else{

        pre->next=s;

    }

    return head;

}

int main()

{

    datatype x;

    linklist head;

    printf("请输入一组升序排列的整数:\n");

    head=creatbyqueue();

    print(head);

    printf("请输入要插入的值:");

    scanf("%d",&x);

    head=insert(head,x);

    print(head);

    delList(head);

    return 0;

}

(4)编写算法函数linklist delallx(linklist head,int x),删除不带头结点单链表head中所有值为x的结点。

#include <stdio.h>

#include <stdlib.h>

typedef int datatype;

typedef struct link_node{

    datatype info;

    struct link_node *next;

}node;

typedef node *linklist;

typedef node *linklist;

linklist creatbystack()

{

    linklist head,s;

    datatype x;

    head=NULL;

    printf("请输入若干整数序列:\n");

    scanf("%d",&x);

    while(x!=0)

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        s->next=head;

        head=s;

        scanf("%d",&x);

    }

    return 0;

}

linklist creatbyqueue()

{

    linklist head,r,s;

    datatype x;

    head=r=NULL;

    printf("请输入若干整数序列:\n");

    scanf("%d",&x);

    while(x!=0)

    {

        s=(linklist)malloc(sizeof(node));

        s->info=x;

        if(head==NULL)

            head=s;

        else r->next=s;

        r=s;

        scanf("%d",&x);

    }

    if(r) r->next=NULL;

    return head;

}

void print(linklist head)

{

    linklist p;

    int i=0;

    p=head;

    printf("List is:\n");

    while(p)

    {

        printf("%5d",p->info);

        p=p->next;

        i++;

        if(i%10==0)  printf("\n");

    }

    printf("\n");

}

void delList(linklist head)

{

    linklist p=head;

    while(p)

    {

        head=p->next;

        free(p);

        p=head;

    }

}

linklist delallx(linklist head,int x)

{

    linklist p,pre=NULL;

    int i;

    p=head;

    if(!p)

    {

        printf("单链表为空,无法删除");

        return NULL;

    }

    while(p)

    {

        if(p->info==x&&!pre)

        {

            head=p->next;

            pre=NULL;

            p=p->next;

        }

        else if(p->info==x&&pre)

        {

            pre->next=p->next;

            p=p->next;

        }

        else

        {

             pre=p;

            p=p->next;

        }

    }

    return head;

}

int main()

{

    datatype x;

    linklist head;

    head=creatbyqueue();

    print(head);

    printf("请输入要删除的值:");

    scanf("%d",&x);

    head=delallx(head,x);

    print(head);

    delList(head);

    return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值