第1关:链表数据结构定义及初始化链表
任务描述
本关任务:完成创建一个带表头的空链表的操作。
编程要求
根据提示,在右侧编辑器补充代码,完成链表结点定义,创建带表头的空链表并返回表头的函数。
开始你的任务吧,祝你成功!
测试:
输入:无
输出:success to create 0
第2关:链表插入和遍历链表输出链表的操作
任务描述
本关任务:
1.编写一个能向表尾插入结点的函数;
2.编写一个能在表头插入结点的函数;
3.编写一个能遍历链表并输出链表各结点数据元素的函数;
相关知识
本关使用的链表结点结构定义为:
struct node
{
int data ; //存放结点的数据元素
struct node *next ; //指向下一个结点的指针,尾结点该域值为NULL
};
开始你的任务吧,祝你成功!
第3关:链表逆置
任务描述
本关任务:完成算法,能实现将链表中的数据元素逆置。
问题描述:有一链表里面存放的是某公司销售人员的月销售数量,目前链表中存放的销售数量是按从小到大排序的,请编写一个算法,将销售数量从大到小排序。
结点类型定义如下:
typedef struct node
{
int saleAmount ;//销售数量
struct node *next;//指向下一产品的指针
}NODE ;
typedef struct node *pNode ;
测试说明
平台会对你编写的代码进行测试:
测试输入:5 4 12 51 82 132
预期输出:132 82 51 12 4
测试输入:6 5 11 151 192 212 500
预期输出:500 212 192 151 11 5
开始你的任务吧,祝你成功!
第4关:查找和交换
任务描述
本关任务:查找符合条件的结点,并将该结点的值与前驱结点的值交换。
开始你的任务吧,祝你成功!
测试输入:
5 -12 34 23 6 7 34
输出:
-12
第5关:链表销毁
任务描述
链表的结点所占空间是动态分配的堆空间,程序员应在退出程序时释放动态分配的空间。
本关任务:
完成destroyLinklist函数,实现链表结点空间的回收
开始你的任务吧,祝你成功!
测试输入:
5 1 2 3 4 5
输出:6
下面是参考代码
#include <stdio.h>
#include <stdlib.h>
//第一关代码
struct node
{//此处填写代码,定义链表结点类型,包含一个存放整型数据的 data 成员,和一个指向下一个结点的next成员
int data;
struct node *next;
};
struct node *mycreateList()
{//此处填写代码,创建一个只有一个头结点的空链表,头节点的数据域赋值为0,并将表头结点的地址返回
struct node *head = (struct node *)malloc(sizeof(struct node));
head->next = NULL;
head->data = 0;
return head;
}
//第二关代码
void myinsertHead(struct node * head, int insData )
{
/*在此处完成任务,实现在head为表头d 链表的头插数据元素insData的功能*/
//begin
struct node* temp = (struct node*)malloc(sizeof(struct node));
temp->data = insData;
temp->next = head->next;
head->next = temp;
//end
}
void myinsertTail(struct node * head , int insData )
{
/*在此处完成任务,在head为表头的单链表表尾插入数据元素insData*/
//begin
struct node *p = head;
while(p->next!=NULL)
p= p->next;
struct node* temp = (struct node*)malloc(sizeof(struct node));
temp->data = insData;
temp ->next = p ->next;
p->next = temp;
//end
}
void myprintList(struct node* L)
{
/*在此处完成任务,输出head为表头链表中的数据,每输出一个数据换一行*/
//begin
struct node* p = L->next;
while (p != NULL)
{
printf("%d\n", p->data);
p = p->next;
}
//end
}
//第三关代码
void reverseList_link(struct node* L)
{
//请在此处填入代码,实现链表逆置功能
//begin
struct node* p;
p = L->next;
L->next = NULL;
while (p!=NULL)
{
struct node* q = p;
p = p->next;
q->next = L->next;
L->next = q;
}
//end
}
int locateAndChange( struct node *L, int data)
{
//请在此处填入代码,在头结点为L的链表中查找 与data值相等的第一个结点,若能找到该结点,则将该结点的值与前驱结点的值交换
//若未找到与data值相等的结点,则返回值为-1,若找到的结点无前驱结点,则返回值为0,否则返回值为前驱结点的值
//begin
struct node* p = L;
struct node* q = L->next;
int res = 0;
while(q != NULL)
{
if(q->data == data)
{
if(p == L)
return 0;
res = p->data;
int temp = p->data;
p->data = q->data;
q->data = temp;
break;
}
p = q;
q = q->next;
}
return res;
//end
}
//第五关代码
int destroyList(struct node *L)
{
//请在此处填写代码,实现将链表L的结点空间回收
//返回值为回收结点的个数,含头结点在内
struct node* p = L->next;
struct node* m;
int num = 0;
while(p != NULL)
{
num++;
m = p;
p = m->next;
free(m);
}
return num + 1;
}