zoukankan      html  css  js  c++  java
  • 尾插法构建线性表

    任务描述

    本关要求按照数据输入的顺序构建一个线性表。即如果输入的3个结点数据分别为123,则构建的线性表包含3个结点,且从前往后的结点数据分别为123

    编程要求

    本关的编程任务是补全step1/insertTail.h文件中insertTail函数,该函数说明如下: // 函数insertTail:链表尾部插入 // 参数:h-链表头指针,t-指向要插入的结点 // 返回值:插入结点后链表的首结点地址 node *insertTail(node *h, node *t);

    评测说明

    本关中包含三个文件分别是: step1/insertTail.h :此文件为学员文件,包含尾插法构建链表的函数实现。 step1/linkList.h:此文件包含链表常见操作的说明与实现,引用了insertTail.h step1/test.cpp:此文件为评测文件(含main函数),引用“linkList.h”。 (上述三个文件可通过点击在代码取的右上角文件夹中的step1文件夹中查看) (注意:本关所实现链式线性表为带头结点的单链表)

    输入输出说明

    输入n(1<=n<=100),再输入n个整数,按输入正序逆序输出这n个整数,如下所示:(注意:链表的输出函数已经实现,详情请阅读step1文件夹中的文件。)

    测试输入: 5 1 2 3 4 5 预期输出: List: 1 2 3 4 5

    测试输入: 3 8 7 6 预期输出: List: 8 7 6

    test.cpp

    #include "linkList.h"
    int main()
    {
        int n, i;
        node* t;
        node* head = new node;// 带头结点单链表,头结点指针head
        head->next=NULL; // 头结点head->next==NULL,链表为空
        // 输入结点数
        cin >> n;
        for (i = 0; i < n; i++)
        {
            // 为新节点动态分配空间
            t = new node;
            cin >> t->data;  // 输入结点数据
            t->next = NULL;  // 结点指针域值为空
            // 调用函数插入结点
            head = insertTail(head, t);
        }
        // 输出链表
        printList(head);
        // 删除结点,释放空间
        delList(head);
        return 0;
    }

    linkList.h

    #include <iostream>
    using namespace std;
    
    // 定义结点结构
    struct node
    {
        int data;  // 数据域
        node* next;  //指针域,指向下一个结点
    };
    
    // 函数insertTail:链表尾部插入
    // 参数:h-链表头指针,t-指向要插入的结点
    // 返回值:插入结点后链表的首结点地址
    node* insertTail(node* h, node* t);
    
    // 函数printList:输出链表,每个数据之间用一个空格隔开
    // 参数:h-链表头指针
    void printList(node* h);
    
    // 函数delList:删除链表,释放空间
    // 参数:h-链表头指针
    void delList(node* h);
    // 函数delList:删除链表,释放空间
    // 参数:h-链表头指针
    
    
    #include"insertTail.h" //包含node* insertTail(node* h, node* t)函数的实现
    
    void delList(node* h)
    {
        node* p = h;  // 指针p指向头结点,第一个要删除的结点
        while (p)  // 这个结点是存在的
        {
            h = h->next;  // 头指针h指向下一个结点(下一个结点的地址存在当前结点的指针域中,即h->next中
            delete p;  // 删除p指向的结点
            p = h;  // p指向当前的头结点,即下一个要删除的结点
        }
    }
    // 函数printList:输出链表,每个数据之间用一个空格隔开
    // 参数:h-链表头指针
    void printList(node* h)
    {
        cout << "List:";
        h = h->next;
        while (h)
        {// h为真,即h指向的结点存在,则输出该结点的数据
            cout << " " << h->data;  // 输出结点数据
            h = h->next;  // 将该结点的指针域赋值给h,h就指向了下一个结点
        }
        cout << endl; // 输出换行符
    }

    insertTail.h

    node* insertTail(node* h, node* t)
    {
        // 请在此添加代码,补全函数insertTail
        /********** Begin *********/
        if(h==NULL) //空链表单独处理
        {
            t->next=NULL; //链表尾指针置为NULL
            return t; //返回第一个结点的地址(即链表头指针)
        }
        //非空链表的情况
        node *p=h;
        //让p指向最后一个结点
        while(p->next)
        {
            p=p->next;
        }
        p->next = t; //让最后一个结点的指针域指向结点t
        t->next=NULL; //链表尾指针置为NULL
        return h;  //返回第一个结点的地址(即链表头指针)
        /********** End **********/
    }
  • 相关阅读:
    让 .Net 程序 脱离 .net framework框架 运行的方法 转
    MySpaces性能提高的过程转
    AskNet 内容查询系统 筹备中
    关于自定义表单的一些想法
    Url重写
    show一下我的办公桌
    IronRuby 初览
    微软将终止对SQL2000的支持
    WCF 消息交换 转
    感受刘德华的努力
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13893249.html
Copyright © 2011-2022 走看看