尾插法构建线性表
任务描述
本关要求按照数据输入的顺序构建一个线性表。即如果输入的3
个结点数据分别为1
、2
、3
,则构建的线性表包含3
个结点,且从前往后的结点数据分别为1
、2
、3
。
编程要求
本关的编程任务是补全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 **********/ }