数据结构C语言版(李云清)实验2 不带头结点的单链表

实验2 不带头结点的单链表

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

/**********************************/
/*文件名称:lab2_01.c                            */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delx(linklist head,datatype x)
{
     
    linklist  pre,p;
    pre=NULL;
    p=head;
    while (p &&p->info!=x)
    {
     
        pre=p;
        p=p->next;
    }
    if (p)
    {
     
           if (pre==NULL)
                    head=p->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);			/*删除单链表的第一个值为x的结点*/
    print(head);
    delList(head);				/*释放单链表空间*/
    return 0;
}

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

/**********************************/
/*文件名称:lab2_02.c                 */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist reverse1(linklist head)
{
     
    linklist p,s;
    p=head;
    head=NULL;
    while (p)
    {
     
        s=p;
        p=p->next;
        s->next=head;
        head=s;
    }
    return head;
}
void reverse2(linklist *head)
{
     
    linklist p,s;
    p=*head;
    *head=NULL;
    while (p)
    {
     
        s=p;
        p=p->next;
        s->next=*head;
        *head=s;
    }
}

int main()
{
        datatype x;
    linklist head;
    head=creatbystack();		    /*头插入法建立单链表*/
    print(head);				            /*输出原链表*/

    head= reverse1(head);		/*倒置单链表*/
     print(head);				            /*输出倒置后的链表*/
    reverse2(&head);			        /*倒置单链表*/
    print(head);
    delList(head);

    return 0;
}

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

/**********************************/
/*文件名称:lab2_03.c                 */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist insert(linklist head ,datatype x)
{
     
        linklist pre,p,s;
        pre=NULL;
        p=head;
        while ( p && p->info<x )
        {
     
            pre=p;
            p=p->next;
        }
        s=(linklist )malloc(sizeof(node));
        s->info=x;

        if (pre==NULL)
        {
     
            s->next=head;
            head=s;
        }
        else
        {
     
            s->next=p;
            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的结点。

/**********************************/
/*文件名称:lab2_04.c                 */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delallx(linklist head,int x)
{
     
     linklist  pre,p;
    pre=NULL;
    p=head;
    while(p)
    {
     
              while (p &&p->info!=x)            //找值为x的结点
                {
     
                        pre=p;
                        p=p->next;
                }
                if (p)                                          //找到了
                {
     
                     if (pre==NULL)                 //删除的结点为第一个结点
                       {
     
                            head=p->next;
                            free(p);
                            p=head;
                       }
                    else                                    //删除的结点不是第一个结点
                        {
     
                            pre->next=p->next;
                            free(p);
                            p=pre->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;
}

你可能感兴趣的:(数据结构C语言版(李云清)实验,数据结构,算法,c语言)