• 【C语言】数据结构C语言版 实验2 不带头结点的单链表


    运行环境:Dev-C++

    vs2013可能不能运行

    首先新建一个头文件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=NULL;
        printf("请输入若干整数序列:
    ");
        scanf("%d",&x);
        while (x!=0)        /*以0结束输入*/
        {   s=(linklist)malloc(sizeof(node));  /*生成待插入结点*/
            s->info=x;
            s->next=head;            /*将新结点插入到链表最前面*/
            head=s;
            scanf("%d",&x);
        }
        return head;                /*返回建立的单链表*/
    }
    /**********************************/
    /*函数名称:creatbyqueue()              */
    /*函数功能:尾插法建立单链表            */
    /**********************************/
    linklist creatbyqueue()
    {
        linklist head,r,s;
        datatype x;
        head=r=NULL;
        printf("请输入若干整数序列:
    ");
        scanf("%d",&x);
        while (x!=0) /*以0结束输入*/
        {    s=(linklist)malloc(sizeof(node));
             s->info=x;
             if (head==NULL)        /*将新结点插入到链表最后面*/
                head=s;
             else
                r->next=s;
            r=s;
            scanf("%d",&x);
       }
        if (r)  r->next=NULL;
        return head;                    /*返回建立的单链表*/
    }
    /**********************************/
    /*函数名称:print()                      */
    /*函数功能:输出不带头结点的单链表      */
    /**********************************/
    void print(linklist head)
    {   linklist p;
        int i=0;
        p=head;
        printf("List is:
    ");
        while(p)
        {
            printf("%5d",p->info);
            p=p->next;
            i++;
            if (i%10==0) printf("
    ");
        }
        printf("
    ");
    }
    /**********************************/
    /*函数名称:delList()                  */
    /*函数功能:释放不带头结点的单链表      */
    /**********************************/
    void delList(linklist head)
    { linklist p=head;
      while (p)
      { head=p->next;
        free(p);
        p=head;
      }
    }

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

    /*编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。
    并构造测试用例进行测试。
    */
    /**********************************/
    /*文件名称:lab2_01.c             */
    /**********************************/
    
    #include "slnklist.h"
    /*请将本函数补充完整,并进行测试*/
    linklist delx(linklist head,datatype x)
    {
        linklist p = head,pre=NULL;//一定要初始化pre=NULL 
        while(p&&p->info!=x)
        {
            pre = p;
            p = p->next;
        }
        if(p)
        {
            if(!pre)
            {
                head = head->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                 */
    /**********************************/
    /*
    假设线性表(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 p,q;
        p=head;
        head = NULL;
        while(p)  //核心
        {
            q = p->next;
            p->next = head;
            head=p;
            p=q;
        }
        return head;
    }
    void reverse2(linklist *head) //不返回值,那就从指针上下手 
    {
        linklist p,q;
        p=*head;
        *head = NULL;
        while(p)
        {
            q = p->next;
            p->next = *head;
            *head=p;
            p=q;
        }
    }
    
    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中,并保持链表有序性。 分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。

    /*
    假设不带头结点的单链表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;
        s = (linklist)malloc(sizeof(node));
        s->info = x;
        p = head;
        pre=NULL;
        while(p&&p->infonext; 
        } 
        if(!pre)  //插在表头 
        {
            s->next = head;
            head = s;
        }else{    //插在中间或者末尾 
            pre->next = s;   
            s->next = p;
        }
    
        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;
    }

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

    /*
    编写算法函数linklist delallx(linklist head, int x),删除不带头结点单链表head中所有值为x的结点。
    */
    /**********************************/
    /*文件名称:lab2_04.c                 */
    /**********************************/
    #include "slnklist.h"
    /*请将本函数补充完整,并进行测试*/
    linklist delallx(linklist head,int x)
    {
        linklist p,t;
        while(head)//如果要删除的是第一个 
        {
            if(head->info==x)
            {
                p=head;
                head=head->next; 
                free(p);//回收p 
            } else {
                break;
            }
        }
        if(head)//如果删除的不是第一个 
        {
            p=head;
            while(p->next)
            {
                if(p->next->info==x)
                {
                    t=p->next;
                    p->next=p->next->next;
                    free(t);
                } else {
                    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;
    }
  • 相关阅读:
    订单模块
    69.Sqrt(x)
    28.Implement strStr()---kmp
    26.Remove Duplicates from Sorted Array
    27.Remove Element---两指针
    支付模块
    Oracle维护:每天的工作
    Oracle Hint
    latch相关视图整理
    oracle常用视图介绍
  • 原文地址:https://www.cnblogs.com/HGNET/p/14032825.html
Copyright © 2020-2023  润新知