数据结构实验三

来源:互联网 发布:matlab 声明一个数组 编辑:程序博客网 时间:2024/06/07 14:38

实验目录

1、编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。
并构造测试用例进行测试。
2、假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数linklist reverse(linklist  head),
将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
3、假设带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
4、编写算法函数linklist delallx(linklist head, int x),删除带头结点单链表head中所有值为x的结点。
5、已知线性表存储在带头结点的单链表head中,请设计算法函数void sort(linklist head),将head中的结点按结点值升序排列。
6、已知两个带头结点的单链表L1和L2中的结点值均已按升序排序,设计算法函数
linklist mergeAscend (linklist L1,linklist L2)将L1和L2合并成一个升序的
带头结单链表作为函数的返回结果;
设计算法函数linklist mergeDescend (linklist L1,linklist L2)
将L1和L2合并成一个降序的带头结单链表作为函数的返回结果;
并设计main()函数进行测试。
7、设计一个算法linklist interSection(linklist L1,linklist L2),
求两个单链表表示的集合L1和L2的交集,并将结果用一个新的带头
结点的单链表保存并返回表头地址。
8、请编写一个算法函数void partion(linklist head),
将带头结点的单链表head中的所有值为奇数的结点调整
到链表的前面,所有值为偶数的结点调整到链表的后面。
9、编写一个程序,用尽可能快的方法返回带头结点单链表中倒数第k个结点的地址,如果不存在,则返回NULL。

实验一

/*编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。并构造测试用例进行测试。*//**********************************//*文件名称:lab3_01.c                 *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist delx(linklist head,datatype x){    linklist pre=head,p=head->next,q;   while(p)   {       if(p->info==x)       {           pre->next=p->next;           free(p);           break;       }       pre=p;       p=p->next;   }    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;}

实验二

/**********************************//*文件名称:lab3_02.c                 *//**********************************//*假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数linklist reverse(linklist  head),将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。*///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist reverse(linklist head){    int flag=1;    linklist p,q,temp;    if(head->next) p=head->next;    if(p->next) q=p->next;    while(q)    {        temp=q->next;        q->next=p;        if(flag) {p->next=NULL;flag=0;}        p=q;        q=temp;    }    head->next=p;    return head;}int main(){   datatype x;    linklist head;    head=creatbystack();/*头插入法建立带头结点的单链表*/    print(head);/*输出原链表*/    head= reverse(head);/*倒置单链表*/    print(head);/*输出倒置后的链表*/    delList(head);    return 0;}

实验三

/*假设带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),将值为x的结点插入到链表head中,并保持链表有序性。分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。*//**********************************//*文件名称:lab3_03.c                 *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist insert(linklist head,datatype x){    linklist p,q=NULL,pre=NULL,h;    h=(node*)malloc(sizeof(node));    h->info=x;    p=head;    if(head->next) q=head->next;    while(q&&q->info<x)    {        pre=q;        q=q->next;    }    if(!pre)    {        head->next=h;        h->next=q;    }    else if(q)    {        pre->next=h;        h->next=q;    }    else    {        pre->next=h;        h->next=NULL;    }    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;}

实验四

/*编写算法函数linklist delallx(linklist head, int x),删除带头结点单链表head中所有值为x的结点。*//**********************************//*文件名称:lab3_04.c                 *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist delallx(linklist head,int x){    linklist p,q,pre,temp;    pre=head;    p=head->next;    while(p)    {        if(p->info==x)        {            temp=p->next;            pre->next=temp;            free(p);            p=temp;        }        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;}

实验五

/*已知线性表存储在带头结点的单链表head中,请设计算法函数void sort(linklist head),将head中的结点按结点值升序排列。*//**********************************//*文件名称:lab3_05.c                 *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist  sort(linklist head){    linklist p,q,pre;    p=q=head->next;    for(;q;q=q->next)    {        for(p=q;p;p=p->next)        {           if(p->info<q->info)           {               int temp=p->info;               p->info=q->info;               q->info=temp;           }        }    }    return head;}int main(){        linklist head;         head=creatbyqueue();   /*尾插法建立带头结点的单链表*/         print(head);        /*输出单链表head*/         sort(head);     /*排序*/         print(head);         delList(head);         return 0;}

实验六

/*已知两个带头结点的单链表L1和L2中的结点值均已按升序排序,设计算法函数linklist mergeAscend (linklist L1,linklist L2)将L1和L2合并成一个升序的带头结单链表作为函数的返回结果;设计算法函数linklist mergeDescend (linklist L1,linklist L2)将L1和L2合并成一个降序的带头结单链表作为函数的返回结果;并设计main()函数进行测试。*//**********************************//*文件名称:lab3_06.c                 *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist mergeAscend(linklist L1,linklist L2){    linklist p1,p2,pre,q1,head;    p1=L1->next;    p2=L2->next;    head=(linklist)malloc(sizeof(node));    head->next=NULL;    pre=head;    while(p1&&p2)    {        if(p1->info<=p2->info)        {            pre->next=p1;            pre=p1;            p1=p1->next;        }        else        {            pre->next=p2;            pre=p2;            p2=p2->next;        }    }     pre->next=p1?p1:p2;    return head;}linklist mergeDescend(linklist L1,linklist L2){}int main(){       linklist h1,h2,h3;         h1=creatbyqueue();     /*尾插法建立单链表,请输入升序序列*/         h2=creatbyqueue();         print(h1);         print(h2);         h3=mergeAscend(h1,h2);/*升序合并到h3*/            /*降序合并请调用h3=mergeDescend(h1,h2); */         print(h3);         delList(h3);         return 0;}

实验七

/*设计一个算法linklist interSection(linklist L1,linklist L2),求两个单链表表示的集合L1和L2的交集,并将结果用一个新的带头结点的单链表保存并返回表头地址。*//**********************************//*文件名称:lab3_07.c                 *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist   interSection(linklist L1, linklist L2){  linklist head,p,q,s,pre;    head=(linklist)malloc(sizeof(node));    head->next=NULL;    pre=head;    for(p=L1->next;p;p=p->next)    {        for(q=L2->next;q;q=q->next)        {            if(q->info==p->info)            {                s=(linklist)malloc(sizeof(node));                s->info=p->info;                pre->next=s;                pre=s;                break;            }        }    }    pre->next=NULL;    return head;}int main(){ linklist h1,h2,h3; h1=creatbyqueue();           /*尾插法建立单链表,输入时请勿输入重复数据*/ h2=creatbyqueue(); print(h1);                   /*输出单链表h1*/ print(h2); h3=interSection(h1,h2);      /* 求h1和h2的交集*/ print(h3); delList(h1); delList(h2); delList(h3); return 0;}

实验八

/*请编写一个算法函数void partion(linklist head),将带头结点的单链表head中的所有值为奇数的结点调整到链表的前面,所有值为偶数的结点调整到链表的后面。*//**********************************//*文件名称:lab3_08.c             *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/void partion(linklist head){    linklist p,s,pre=head;    p=head->next;    while(p)    {        if(p->info%2==0)        {            pre=p;            p=p->next;        }        else        {            s=p;            pre->next=p->next;            p=pre->next;            s->next=NULL;            s->next=head->next;            head->next=s;        }    }}int main(){        linklist head;         head=creatbyqueue();           /*尾插法建立带头结点的单链表*/         print(head);                   /*输出单链表head*/         partion(head);         print(head);         delList(head);         return 0;}

实验九

/*编写一个程序,用尽可能快的方法返回带头结点单链表中倒数第k个结点的地址,如果不存在,则返回NULL。*//**********************************//*文件名称:lab3_09.c             *//**********************************///#include "slnklist.h"/*请将本函数补充完整,并进行测试*/linklist   search(linklist head,int k){    int cnt=0,i;    linklist p=head->next,q;    for(p;p;p=p->next)        cnt++;    if(cnt<k)        return 0;    else    {        p=head;        for(i=1;i<=cnt-k+1;i++)            p=p->next;    }    return p;}int main(){     int k;     linklist head,p;     head=creatbyqueue();        /*尾插法建立带头结点的单链表*/     print(head);                  /*输出单链表head*/     printf("k=");     scanf("%d",&k);     p=search(head,k);     if (p) printf("%d\n",p->info);     else         printf("Not Found!\n");     delList(head);     return 0;}

头文件

#include <stdio.h>#include <stdlib.h>/**************************************//* 链表实现的头文件,文件名slnklist.h *//**************************************/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=(linklist)malloc(sizeof(node));    head->next=NULL;    printf("请输入整数序列(空格分开,以0结束):\n");    scanf("%d",&x);    while (x!=0)    {        s=(linklist)malloc(sizeof(node));        s->info=x;        s->next=head->next;        head->next=s;        scanf("%d",&x);    }    return head;}/***************************************//*函数名称:creatbyqueue()    *//*函数功能:尾插法建立带头结点的单链表 *//***************************************/linklist creatbyqueue(){    linklist head,r,s;    datatype x;    head=r=(linklist)malloc(sizeof(node));    head->next=NULL;    printf("请输入整数序列(空格分开,以0结束):\n");    scanf("%d",&x);    while (x!=0)    {        s=(linklist)malloc(sizeof(node));        s->info=x;        r->next=s;        r=s;        scanf("%d",&x);    }    r->next=NULL;    return head;}/**********************************//*函数名称:print()  *//*函数功能:输出带头结点的单链表      *//**********************************/void print(linklist head){    linklist p;    int i=0;    p=head->next;    printf("List is:\n");    while(p)    {        printf("%7d",p->info);        i++;        if (i%10==0)    printf("\n");        p=p->next;    }    printf("\n");}/******************************************//*函数名称:creatLink()       *//*函数功能:从文件中读入n个数据构成单链表 *//******************************************/linklist creatLink(char *f, int n){    FILE *fp;    int i;    linklist s,head,r;    head=r=(linklist)malloc(sizeof(node));    head->next=NULL;    fp=fopen(f,"r");    if (fp==NULL)        return head;    else    {        for (i=0; i<n; i++)        {            s=(linklist)malloc(sizeof(node));            fscanf(fp,"%d",&(s->info));            r->next=s;            r=s;        }        r->next=NULL;        fclose(fp);        return head;    }}/*    函数名称:writetofile    函数功能:将链表内容存入文件f*/void writetofile(linklist head, char *f){    FILE *fp;    linklist p;    int i=0;    fp=fopen(f,"w");    if (fp!=NULL)    {        p=head->next;        fprintf(fp,"%s","List is:\n");        while(p)        {            fprintf(fp,"%7d",p->info);            i++;            if (i%10==0)    fprintf(fp,"%c",'\n');            p=p->next;        }        fprintf(fp,"%c",'\n');        fclose(fp);    }    else    printf("创建文件失败!");}/**********************************//*函数名称:delList()  *//*函数功能:释放带头结点的单链表      *//**********************************/void delList(linklist head){    linklist p=head;    while (p)    {        head=p->next;        free(p);        p=head;    }}




原创粉丝点击