头插法构建线性表

任务描述

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

编程要求

本关的编程任务是补全step2/insertHead.h文件中的insertHead函数,以实现实现通过在链表头部插入节点,从而实现逆序构建线性表,该函数说明如下: // 函数insertHead:链表头部插入 // 参数:h-链表头指针,t-指向要插入的结点 // 返回值:插入结点后链表的首结点地址 node *insertHead(node *h, node *t);

评测说明

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

输入输出说明

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

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

测试输入: 5 2 4 6 8 0 预期输出: List: 0 8 6 4 2

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 = insertHead(head, t);
    }
    //输出链表
    printList(head);
    //删除结点,释放空间
    delList(head);

    return 0;
}

 

linkList.h

#include <iostream>
using namespace std;

// 定义结点结构
struct node
{
    int data;  // 数据域
    node* next;  // 指针域,指向下一个结点
};

// 函数insertHead:链表头部插入
// 参数:h-链表头指针,t-指向要插入的结点
// 返回值:插入结点后链表的首结点地址
node* insertHead(node* h, node* t);

// 函数printList:输出链表,每个数据之间用一个空格隔开
// 参数:h-链表头指针
void printList(node* h);



// 函数delList:删除链表,释放空间
// 参数:h-链表头指针
void delList(node* h);



#include"insertHead.h" //包含node* insertHead(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:";
    if (h->next != NULL) h = h->next;
    while (h)
    {// h为真,即h指向的结点存在,则输出该结点的数据
        cout << " " << h->data;  // 输出结点数据
        h = h->next;  // 将该结点的指针域赋值给h,h就指向了下一个结点
    }
    cout << endl; // 输出换行符
}

 

insertHead.h

// 函数insertHead:链表头部插入
// 参数:h-链表头指针,t-指向要插入的结点
// 返回值:插入结点后链表的头结点地址
node* insertHead(node* h, node* t)
{
    // 请在此添加代码,补全函数insertHead
    /********** Begin *********/
    
    t->next=h->next;
    h->next=t;

    /********** End **********/
}

 

posted @ 2020-10-28 20:36  XXXSANS  阅读(595)  评论(0编辑  收藏  举报