成绩排序(练习链表)

成绩排序(练习链表)_第1张图片成绩排序(练习链表)_第2张图片成绩排序(练习链表)_第3张图片

(图片别看错了,右边的是输出样例)

前几天学了学链表,也把一些ADT格式敲了敲,但是还是没有实际用过

然后就选了一道排序题,顺便试了试插入排序

以前只知道有插入排序这个东西,但是用数组实现的话感觉效率会偏低,现在知道链表之后就知道该怎么玩了(乐)

代码如下:

#include
#include
typedef int ElemType;
typedef struct LNode{
	ElemType data;
    ElemType ID;
	struct LNode * next;
}LinkList;

LinkList * creat(int n)
{
	LinkList * head, * node, * end;//定义头节点,普通节点,尾部节点
	head = (LinkList *)malloc(sizeof(LinkList));//分配地址
	end = head;
	for(int i = 0; i < n; i++)
	{
		node = (LinkList *)malloc(sizeof(LinkList));//分配地址
		scanf("%d%d", &node->ID, &node->data);
		end->next = node;
		end = node;
	}
	end->next = NULL;//结束创建
	return head;
}//创建长度为n的链表
void DestroyList(LinkList * head)
{
	LinkList * end = head;
	do
	{
		end = end->next;
		free(head);
		head = end;
	}while(end != NULL);
	return;
}//销毁链表

int main(void)
{
    int N;
    scanf("%d", &N);
    LinkList * head = creat(1);
    //插入排序
    for(int i = 1; i < N; i++)
    {
        int t_ID, t_data;
        scanf("%d%d", &t_ID, &t_data);
        for(LinkList * node = head->next, * f_node = head; 1; node = node->next, f_node = f_node->next)
        {
            if(node == NULL || t_data > node->data || (t_data == node->data && t_ID < node->ID))
            {
                LinkList * tmp = (LinkList *)malloc(sizeof(LinkList));
                f_node->next = tmp, tmp->next = node;
                tmp->data = t_data, tmp->ID = t_ID;
                break;
            }
        }
    }
    //输出
    int tmp = 1, count = 1;
    for(LinkList * node = head->next, * f_node = head; 1; )
    {
        printf("%d %d %d\n", tmp, node->ID, node->data);
        node = node->next, f_node = f_node->next;
        if(node == NULL)  break;
        else
        {
            count++;
            if(f_node->data > node->data)  tmp = count;
        }
    }
    DestroyList(head);

    return 0;
}

效率还是比较高的(不知道是不是我的错觉),对1000个数据进行排序的时间不超过8ms

一些废话:

昨天晚上上思政课,差点给我干昏过去,整什么课上辩论赛,还要提问,太抽象了,我一个理科生看着马院等等院的大佬在那边讲什么因然,什么实然。能不能对我这种不对哲学有一点点兴趣的绯雾温柔点,md我看算法书都惊心胆颤

辩题是有没有普适(世)性的价值观,在那边咬文嚼字

简单来说不就是证明存在性的问题嘛,那坚持存在的一方举出例子,反方争辩不存在不就行了(doge)

所以说这种东西就是不如高数让我感觉脚踏实地,果然我不是学文科的料

你可能感兴趣的:(链表,数据结构,算法,c语言)