• 带头结点的单链表——数据结构课堂作业


    /**************************************/
    /* 链表实现的头文件,文件名slnklist.h */
    /**************************************/
    #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结束):
    ");
        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结束):
    ");
        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:
    ");
        while(p)
        {
            printf("%7d",p->info);
            i++;
            if (i%10==0)    printf("
    ");
            p=p->next;
        }
        printf("
    ");
    
    }
    
    /******************************************/
    /*函数名称: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:
    ");
            while(p)
            {
                fprintf(fp,"%7d",p->info);
                i++;
                if (i%10==0)    fprintf(fp,"%c",'
    ');
                p=p->next;
            }
            fprintf(fp,"%c",'
    ');
            fclose(fp);
        }
        else    printf("创建文件失败!");
    
    }
    
    
    /**********************************/
    /*函数名称:delList()                  */
    /*函数功能:释放带头结点的单链表      */
    /**********************************/
    void delList(linklist head)
    {
        linklist p=head;
        while (p)
        {
            head=p->next;
            free(p);
            p=head;
        }
    }
    View Code
    /*编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。
    并构造测试用例进行测试。
    */
    /**********************************/
    /*文件名称:lab3_01.c                 */
    /**********************************/
    /*编写函数void delx(linklist head, datatype x),删除带头结点单链表head中第一个值为x 的结点。
    并构造测试用例进行测试。
    */
    /**********************************/
    /*文件名称:lab3_01.c                 */
    /**********************************/
    #include "slnklist.h"
    /*请将本函数补充完整,并进行测试*/
    linklist delx(linklist head,datatype x)
    {
        if(head->next->info==x)
        {
            head = head->next;
            return head;
        }
        else
        {
            linklist p = head;
            linklist pre = head;
            p = p->next ->next;
            pre = pre->next;
            while()
            {
                if(p->info==x)
                {
                    pre->next = p->next;
                    return head;
                }
                else {
                    pre = p;
                    p = p->next;
                }
            }
        }
    }
    
    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;
    }
    View Code
    /**********************************/
    /*文件名称:lab3_02.c                 */
    /**********************************/
    /*
    假设线性表(a1,a2,a3,…an)采用带头结点的单链表存储,请设计算法函数linklist reverse(linklist  head),
    将带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
    */
    /**********************************/
    /*文件名称: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)
    {
        linklist p = head ->next;
        linklist thead,s;
        thead = (linklist)malloc(sizeof(node));
        thead ->next = NULL;
        while(p)
        {
            datatype x = p->info;
            s=(linklist)malloc(sizeof(node));
            s->info=x;
            s->next=thead->next;
            thead->next=s;
            p = p->next;
        }
        return head = thead;
    }
    int main()
    {
        datatype x;
        linklist head;
        head=creatbystack();            /*头插入法建立带头结点的单链表*/
        print(head);                    /*输出原链表*/
        head= reverse(head);            /*倒置单链表*/
        print(head);                    /*输出倒置后的链表*/
        delList(head);
        return 0;
    }
    View Code
    /*
    假设带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
    将值为x的结点插入到链表head中,并保持链表有序性。
    分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
    */
    /**********************************/
    /*文件名称:lab3_03.c                 */
    /**********************************/
    /*
    假设带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
    将值为x的结点插入到链表head中,并保持链表有序性。
    分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
    */
    /**********************************/
    /*文件名称:lab3_03.c                 */
    /**********************************/
    #include "slnklist.h"
    /*请将本函数补充完整,并进行测试*/
    linklist insert(linklist head,datatype x)
    {
        linklist p = head->next;
        linklist pre = head;
    
        while(p) {
            if(p->info>x) {
                linklist s;
                s = (linklist)malloc(sizeof(node));
                s->info = x;
                pre->next = s;
                s->next = p;
                break;
            }
            else {
                pre = p;
                p = p->next;
            }
        }
        return head;
    
    }
    int main()
    {
        datatype x;
        linklist head;
        printf("输入一组升序排列的整数:
    ");
        head=creatbyqueue();                /*尾插入法建立带头结点的单链表*/
        print(head);
        printf("请输入要插入的值:");
        scanf("%d",&x);
        head=insert(head,x);                /*将输入的值插入到带头结点的单链表适当位置*/
        print(head);
        delList(head);
        return 0;
    }
    View Code
    /*
    编写算法函数linklist delallx(linklist head, int x),删除带头结点单链表head中所有值为x的结点。
    */
    /**********************************/
    /*文件名称:lab3_04.c                 */
    /**********************************/
    /*
    编写算法函数linklist delallx(linklist head, int x),删除带头结点单链表head中所有值为x的结点。
    */
    /**********************************/
    /*文件名称:lab3_04.c                 */
    /**********************************/
    #include "slnklist.h"
    /*请将本函数补充完整,并进行测试*/
    linklist delallx(linklist head,int x)
    {
        linklist p = head->next;
        linklist pre = head;
        while(p)
        {
            if(p->info == x)
            {
                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;
    }
    View Code
    /*
    已知线性表存储在带头结点的单链表head中,请设计算法函数void sort(linklist head),将head中的结点按结点值升序排列。
    */
    /**********************************/
    /*文件名称:lab3_05.c                 */
    /**********************************/
    /*
    已知线性表存储在带头结点的单链表head中,请设计算法函数void sort(linklist head),将head中的结点按结点值升序排列。
    */
    /**********************************/
    /*文件名称:lab3_05.c                 */
    /**********************************/
    #include "slnklist.h"
    #include <stdlib.h>
    
    /*请将本函数补充完整,并进行测试*/
    void  sort(linklist head)
    {
        linklist i,j;
        for(i = head->next;i;) {
            for(j=i;j;) {
                if(i->info>j->info) {
                    datatype temp = i->info;
                    i->info = j->info;
                    j->info = temp;
                }
                j = j->next;
            }
            i = i->next;
        }
    
    }
    int main()
    {
        linklist head;
        head=creatbyqueue();           /*尾插法建立带头结点的单链表*/
        print(head);                    /*输出单链表head*/
        sort(head);                     /*排序*/
        print(head);
        delList(head);
        return 0;
    }
    View Code
    /*
    已知两个带头结点的单链表L1和L2中的结点值均已按升序排序,设计算法函数
    linklist mergeAscend (linklist L1,linklist L2)将L1和L2合并成一个升序的
    带头结单链表作为函数的返回结果;
    设计算法函数linklist mergeDescend (linklist L1,linklist L2)
    将L1和L2合并成一个降序的带头结单链表作为函数的返回结果;
    并设计main()函数进行测试。
    */
    /**********************************/
    /*文件名称:lab3_06.c                 */
    /**********************************/
    /*
    已知两个带头结点的单链表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 reverse(linklist head)
    {
        linklist p = head ->next;
        linklist thead,s;
        thead = (linklist)malloc(sizeof(node));
        thead ->next = NULL;
        while(p)
        {
            datatype x = p->info;
            s=(linklist)malloc(sizeof(node));
            s->info=x;
            s->next=thead->next;
            thead->next=s;
            p = p->next;
        }
        return head = thead;
    }
    
    linklist mergeAscend(linklist L1,linklist L2)
    {
    
        linklist head,r,s;
        datatype x;
        head=r=(linklist)malloc(sizeof(node));
        head->next=NULL;
    
        L1 = L1->next;
        L2 = L2->next;
    
        while(L1&&L2)
        {
            s = (linklist)malloc(sizeof(node));
    
            if(L1->info<L2->info)
            {
                s ->info = L1->info;
                r ->next = s;
                r = s;
    
                L1 = L1 ->next;
            }
            else if(L1->info>L2->info)
            {
                s->info =  L2->info;
                r->next = s;
                r = s;
                L2 = L2 ->next;
            }
            else
            {
                s->info = L1 ->info;
                r->next = s;
                r = s;
                L2 = L2->next;
                L1 = L1->next;
            }
        }
    
        if(L1)
        {
            s = (linklist)malloc(sizeof(node));
            s ->info = L1->info;
            r ->next = s;
            r = s;
            L1 = L1->next;
        }
        else if(L2)
        {
            s = (linklist)malloc(sizeof(node));
            r->next = s;
            r = s;
            L2 = L2->next;
        }
        r->next=NULL;
        return head;
    }
    
    linklist mergeDescend(linklist L1,linklist L2)
    {
        linklist head = mergeAscend(L1,L2);
        head = reverse(head);
        return head;
    
    }
    
    int main()
    {
        linklist h1,h2,h3;
        h1=creatbyqueue();     /*尾插法建立单链表,请输入升序序列*/
        h2=creatbyqueue();
        print(h1);
        print(h2);
        //h3=mergeAscend(h1,h2);/*升序合并到h3*/
        /*降序合并请调用h3=mergeDescend(h1,h2); */
        h3=mergeDescend(h1,h2);
        print(h3);
        delList(h3);
        return 0;
    }
    View Code
    /*
    设计一个算法linklist interSection(linklist L1,linklist L2),
    求两个单链表表示的集合L1和L2的交集,并将结果用一个新的带头
    结点的单链表保存并返回表头地址。
    */
    /**********************************/
    /*文件名称:lab3_07.c                 */
    /**********************************/
    /*
    设计一个算法linklist interSection(linklist L1,linklist L2),
    求两个单链表表示的集合L1和L2的交集,并将结果用一个新的带头
    结点的单链表保存并返回表头地址。
    */
    /**********************************/
    /*文件名称:lab3_07.c                 */
    /**********************************/
    #include "slnklist.h"
    /*请将本函数补充完整,并进行测试*/
    linklist   interSection(linklist L1, linklist L2)
    {
    
        linklist head,r,s;
        datatype x;
        head=r=(linklist)malloc(sizeof(node));
        head->next=NULL;
    
        linklist i,j;
        for(i=L1->next; i;)
        {
            for(j=L2->next; j;)
            {
                if(i->info==j->info)
                {
                    s=(linklist)malloc(sizeof(node));
                    s->info=i->info;
                    r->next=s;
                    r=s;
                    break;
                }
                else j = j->next;
            }
            i = i->next;
        }
    
        r ->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;
    }
    View Code
    /*
    请编写一个算法函数void partion(linklist head),
    将带头结点的单链表head中的所有值为奇数的结点调整
    到链表的前面,所有值为偶数的结点调整到链表的后面。
    */
    
    /**********************************/
    /*文件名称:lab3_08.c             */
    /**********************************/
    /*
    请编写一个算法函数void partion(linklist head),
    将带头结点的单链表head中的所有值为奇数的结点调整
    到链表的前面,所有值为偶数的结点调整到链表的后面。
    */
    
    /**********************************/
    /*文件名称:lab3_08.c             */
    /**********************************/
    #include "slnklist.h"
    /*请将本函数补充完整,并进行测试*/
    void partion(linklist head)
    {
        linklist p,s,pre;
        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;
    }
    View Code
    /*
    编写一个程序,用尽可能快的方法返回带头结点单链表中倒数第k个结点的地址,如果不存在,则返回NULL。
    */
    /**********************************/
    /*文件名称:lab3_09.c             */
    /**********************************/
    /*
    编写一个程序,用尽可能快的方法返回带头结点单链表中倒数第k个结点的地址,如果不存在,则返回NULL。
    */
    /**********************************/
    /*文件名称:lab3_09.c             */
    /**********************************/
    #include "slnklist.h"
    /*请将本函数补充完整,并进行测试*/
    linklist   search(linklist head,int k)
    {
        linklist p = head;
        int cnt = 0;
        p =p->next;
        while(p) {
            cnt ++;
            p = p->next;
        }
        p = head;
    
        int ans = cnt - k + 1;
        while(ans--) {
            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
    ",p->info);
         else
             printf("Not Found!
    ");
         delList(head);
         return 0;
    }
    View Code
  • 相关阅读:
    sysaux 过大如何清理释放空间
    oracle获取当前时间前半小时和整点的时间
    在Mac OS 下 npm install 报权限不足的错误
    基于 NPOI + 反射的Excel导入帮助类
    从零开始 MongoDB 集群(ReplSet)搭建 之一 MongoDB的安装
    使用Swagger导入cvs文件出现乱码的解决办法
    基于DynamicExpresso的自定义表达式计算
    从零开始 MongoDB 集群(ReplSet)搭建 之二 群集搭建
    halcon视觉入门钢珠识别
    纯前端如何在网页端播放摄像头的实时画面
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6059504.html
Copyright © 2020-2023  润新知