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

实验1

编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。
并构造测试用例进行测试。
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delx(linklist head,datatype x)
{
	linklist pre=NULL,p,q;
    p=head;
    while(p&&p->info!=x){ pre=p;p=p->next; }    //  找到第一个x的位置;
    if(p){
        if(!pre) head=head->next;           //  第一个数就是要删除的x;
        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)。并构造测试用例进行测试。
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist reverse1(linklist head)
{
    linklist newH,q,p;
    p=head;
    newH=NULL;
    while(p!=NULL){         //  两次头插法,便改变一次顺序;
        q=p; p=p->next;
        q->next=newH;
        newH=q;
    }
    return newH;
}
void reverse2(linklist *head)
{
    linklist p=NULL,q=*head;
    while(q!=NULL){
        *head=q->next;  //  保留下一个结点;
        q->next=p;
        p=q;
        q=*head;        //  移动到下一个结点;
    }
    *head=p;            //  指向逆置后的头结点;
}

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=NULL,h=head,p;
    while(h&&h->infonext;
    }
    p=(node*)malloc(sizeof(node));
    p->info=x;
    if(pre==NULL){          //  第一种情况,表头;
        p->next=head;
        head=p;
    }else if(h){            //  第一种情况,表中;
        p->next=pre->next;
        pre->next=p;
    }else if(!h){           //  第一种情况,表尾;
        p->next=NULL;
        pre->next=p;
    }
    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=NULL,p;
	if(!head){
		printf("单链表是空的");
		return head;
    }
    p=head;
	do{
        while(p&&p->info!=x){       //  查找第一个x;
            pre=p;p=p->next;
		}
        if(p){
            if(!pre) head=head->next,pre=NULL;      //  如果第一个x是在表头,要将pre重新赋为NULL;
            else pre->next=p->next;
        }
        p=p->next;      //  从删除的位置的下一个开始查找;
	}while(p);
	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;
}


你可能感兴趣的:(实验2 不带头节点的单链表)