真题(西北工业大学):

编程实现:

在主函数中,从键盘读入10个整数,按从大到小的顺序构造链表。每读入一个整数, 就调用函数,函数根据整数的大小在合适的位置插入链表。

题目分析:

实现思想:

  1. 循环输入10个整数
  2. 给每个数动态创建一个结点,用 malloc 函数动态分配内存
  3. 查找这个数在链表中该存放的位置
  4. 插入进去
  5. 输出结果

难点击破:

这道题只有2个难点,也是考点所在:

  1. 建立链表
  2. 从大到小插入到链表里
1.链表

直接上代码

struct node
{
	int data;
	struct node* next;
};

以上就是链表中的一个结点,它的所有结点都长一个样。

data用来存放数据,next用来指向下一个结点。下一个结点的data也是用来放数据,next也是指向它的下一个结点。

直到链表的结尾(尾结点),它的data放的同样是数据,但next是一个空指针(值为NULL)。

2.从大到小插入到链表里

我们先判断位置,然后插入。

判断位置只需要一个循环结构来判断。 以下这个循环会在 n 小于前data, 大于后data时,停下来

while (p->next && n > p->next->data)//p指向的是头结点, n是待插入的数据
	{
		p = p->next;
	}

插入结点

//给新结点分配空间
	new = (Link)malloc(sizeof(struct node));
	
	//判断是否开辟成功
	if (new == NULL)
	{
		perror("malloc:new");
		exit(1);
	}

	//插入新数据
	new->data = n;
	new->next = p->next;
	p->next = new;

现在2个难点都已攻破,我们可以写全部的代码了

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>
#include <malloc.h>

//链表节结点
typedef struct node
{
	int data;
	struct node* next;
}* Link;

//解题的主要函数实现
//向链表中插入一个数
//并按降序的方式来排序
void InsertLink(Link head, int n)
{
	assert(head);

	Link new = NULL;
	Link p = head;

	//找到合适的位置,用来插入新数据
	//该循环会在数据小于前data, 大于后data时,停下来
	while (p->next && n > p->next->data)
	{
		p = p->next;
	}

	//为新数据分配空间
	new = (Link)malloc(sizeof(struct node));

	if (new == NULL)
	{
		perror("malloc:new");
		exit(1);
	}

	//将new插入到*p之后
	new->data = n;
	new->next = p->next;
	p->next = new;
}

int main()
{
	int n = 0;
	int i = 0;
	Link p = NULL;
	Link tem = NULL;
	Link head = NULL;

	//建立链表头节点
	head = (Link)malloc(sizeof(struct node));

	if (head == NULL)
	{
		perror("malloc:head");
		return 1;
	}

	head->next = NULL;

	while (i < 10)
	{
		scanf("%d", &n);
		InsertLink(head, n);
		i++;
	}

	//打印结果
	p = head->next;
	for (i = 0; i < 10 && p; i++)
	{
		printf("%d ", p->data);
		p = p->next;
	}

	//释放内存
	p = head;
	while (p)
	{
		tem = p;
		p = p->next;
		free(tem);
	}
	head = NULL;

	return 0;
}

运行结果:

C语言解题 || 考研100种经典题型-数据类型-链表的插入_数据