链式线性表——课上练

第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;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值