真题(西北工业大学):
编程实现:
在主函数中,从键盘读入10个整数,按从大到小的顺序构造链表。每读入一个整数, 就调用函数,函数根据整数的大小在合适的位置插入链表。
题目分析:
实现思想:
- 循环输入10个整数
- 给每个数动态创建一个结点,用 malloc 函数动态分配内存
- 查找这个数在链表中该存放的位置
- 插入进去
- 输出结果
难点击破:
这道题只有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;
}