数据结构-实验三(带头结点的单链表)

1.编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。并构造测试用例进行测试。

#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
void delx(linklist head,datatype x)
{
linklist pre,p;
    pre=head;
    p=head->next;
    while (p && p->info!=x)         //查找
    {
        pre=p;
        p=p->next;
    }
    if (p)                                          //删除
    {
        pre->next=p->next;
        free(p);
    }
}

int main()
{   datatype x;
    linklist head;
    head=creatbyqueue();		/*尾插入法建立带头结点的单链表*/
    print(head);
    printf("请输入要删除的值:");
    scanf("%d",&x);
    delx(head,x);			            /*删除单链表的第一个值为x的结点*/
    print(head);
    delList(head);				/*释放单链表空间*/
    return 0;
}

 2.假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数void reverse(linklist  head),将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。

#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
void reverse(linklist head)
{
 linklist p,s;
        p=head->next;
        head->next=NULL;
        while (p)
        {
            s=p;
            p=p->next;
            s->next=head->next;
            head->next=s;
        }
}
int main()
{   datatype x;
    linklist head;
    head=creatbystack();			/*头插入法建立带头结点的单链表*/
    print(head);					/*输出原链表*/
    reverse(head);			/*倒置单链表*/
    print(head);					/*输出倒置后的链表*/
    delList(head);
    return 0;
}

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

#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
void  insert(linklist head ,datatype x)
{
 linklist pre,p,s;
    pre=head;
    p=head->next;
    while (p && p->info<x)
    {
        pre=p;
        p=p->next;
    }
    s=(linklist)malloc(sizeof(node));
    s->info=x;
    s->next=p;
    pre->next=s;
}
int main()
{   datatype x;
    linklist head;
    printf("输入一组升序排列的整数:\n");
    head=creatbyqueue();				/*尾插入法建立带头结点的单链表*/
    print(head);
    printf("请输入要插入的值:");
    scanf("%d",&x);
    insert(head,x);				    /*将输入的值插入到带头结点的单链表适当位置*/
    print(head);
    delList(head);
    return 0;
}

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

#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
void  delallx(linklist head,int x)
{
linklist pre,p;
    pre=head;
    p=head->next;
    while(p)
    {
        while (p &&p->info!=x)      //查找
        {
            pre=p;
            p=p->next;
        }
        if (p)                                      //找到了
        {
            pre->next=p->next;
            free(p);
            p=pre->next;                    //删除后p回到pre的后继结点
        }
    }
}
int main()
{   datatype x;
    linklist head;
    head=creatbyqueue();				/*尾插入法建立带头结点的单链表*/
    print(head);
    printf("请输入要删除的值:");
    scanf("%d",&x);
    delallx(head,x);
    print(head);
    delList(head);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值