文章中提到的代码模板可参考《简明数据结构》期末备考之链表专题
试题描述
先将键盘输入的一组整数依次存入循环链表(尾插法),然后删除头部第一个元素,最后将其余元素逆序输出。
样例输入
4 2 8 6 9
样例输出
9 8 6 2
语言
C
OJ提交结果
KLP平台编译运行通过,答案正确。
思路分析
根据题目意思,要删除头部第一个元素,所以本题在初始化建立单链表的时候做了一些手脚,直接对第一个读入的整数不作任何处理,从第二个整数开始构建单链表,套用尾插法建立带头结点的单链表模板;
LinkList CreateFromTail1() /*将新增的字符追加到链表的末尾*/
{
LinkList L;
Node *r, *s;
int flag = 1;
L = (Node *)malloc(sizeof(Node)); /*为头结点分配存储空间*/
L->next = NULL;
r = L; /*r指针始终动态指向链表的当前表尾*/
while(flag) /*标志,初值为1。输入"$"时flag为0,链表结束*/
{
char c = getchar();
if(c != '$')
{
s = (Node *)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL;
}
}
return L;
}
将其余元素逆序输出,对单链表进行从大到小的冒泡排序,得到逆序单链表,套用对一个带头结点的单链表进行冒泡排序模板
void BubbleSort(LinkList L)
{
int i ,count = 0, num;
Node *p, *q, *tail;
p = L;
while(p->next != NULL)
{
count++;
p = p->next;
}
for(i = 0; i < count - 1; i++)
{
num = count - i - 1;
q = L->next;
p = q->next;
tail = L;
while(num--)
{
if(q->data > p->data)
{
q->next = p->next;
p->next = q;
tail->next = p;
}
tail = tail->next;
q = tail->next;
p = q->next;
}
}
}
源代码
以下代码在DEVC++中运行时,输出会有异常,但是KLP平台验证答案正确。
#include<stdio.h>
#include<malloc.h>
int len;
typedef struct node{
int data;
struct node *next;
}Node, *LinkList;
LinkList CreateFromTail()
{
LinkList L;
int x;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
Node *r, *s;
char ch = 0;
r = L;
scanf("%d",&x);
while(ch != EOF)
{
scanf("%d",&x);
s = (Node *)malloc(sizeof(Node));
s->data = x;
r->next = s;
r = s;
len ++;
ch = getchar();
}
r->next = NULL;
return L;
}
void Listsort(Node* &head) {
int i = 0;
int j = 0;
Node *L = head;
Node *p;
Node *p1;
for (i = 0; i < len - 1; i++) {
L = head->next;
for (j = 0; j < len - i - 1; j++) {
p = L;
p1 = L->next;
if (p->data < p1->data) {
int temp = p->data;
p->data = p1->data;
p1->data = temp;
}
L = L->next;
}
}
}
void PrintLinkList(LinkList L)
{
Node *p;
p = L->next;
while(NULL != p->next)
{
printf("%d ",p->data);
p = p->next;
}
printf("%d",p->data);
}
int main()
{
LinkList L = CreateFromTail();
Listsort(L);
PrintLinkList(L);
return 0;
}