文章中提到的代码模板可参考《简明数据结构》期末备考之链表专题
试题描述
先将键盘输入的k(k>3)个整数依次存入单链表,输出该单链表,然后删除倒数第3个位置的整数,最后将其余整数逆序输出。
样例输入
1 2 3 4 5 6
样例输出
1 2 3 4 5 6
6 5 3 2 1
语言
C
OJ提交结果
KLP平台编译运行通过,答案正确。
思路分析
1.套用尾插法建立带头结点的单链表模板
//尾插法建立带头结点的链表
LinkList CreateFromTail() /*将新增的字符追加到链表的末尾*/
{
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;
}
本题为防止时间超限,采用以下两种方法来处理:
scanf("%d",&x) != EOF的读入判断。
读入时判断每个元素的后一位是否为空格,如果是空格就继续读入,如果不为空格则退出循环。
2.套用在带头结点的单链表中删除结点模板
bool DelList(LinkList L, int i, ElemType *e)
{
Node *p, *r;
p = L;
int k = 0;
while(p->next != NULL && k < i - 1)
{
p = p->next;
k ++;
}
if(p->next == NULL)
{
printf("删除位置不合理!\n");
return false;
}
r = p->next;
*e = r->data;
p->next = p->next->next;
free(r);
return true;
}
//对于异常的处理可以根据题目要求再自行完善
3.套用逆置带头结点的单链表模板
LinkList ReverseLinkList(LinkList L)
{
Node *p1, *p2, *p3;
p1 = (Node *)malloc(sizeof(Node));
p2 = (Node *)malloc(sizeof(Node));
p3 = (Node *)malloc(sizeof(Node));
p1 = L->next;
p2 = p1->next;
p1->next = NULL;
p3 = p2->next;
while(p3 != NULL)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
L->next = p2;
return L;
}
源代码1
以下代码在DEVC++中运行时,输出会有异常,但是KLP平台验证答案正确。
采用时间超限问题处理方法一:
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct Node{
ElemType data;
struct Node *next;
}Node, *LinkList;
int len = 0;
LinkList CreateFromTail()
{
LinkList L;
int x;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
Node *r, *s;
r = L;
int flag = 1;
while(scanf("%d",&x) != EOF)
{
len ++;
s = (Node *)malloc(sizeof(Node));
s->data = x;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
void DelList(LinkList L, int i)
{
Node *p, *r;
p = L;
int k = 0;
while(p->next != NULL && k < i - 1)
{
p = p->next;
k ++;
}
r = p->next;
p->next = p->next->next;
free(r);
}
void PrintLinkList(LinkList L)
{
Node *r = L->next;
while(r != NULL)
{
printf("%d ",r->data);
r = r->next;
}
}
LinkList ReverseLinkList(LinkList L)
{
Node *p1, *p2, *p3;
p1 = (Node *)malloc(sizeof(Node));
p2 = (Node *)malloc(sizeof(Node));
p3 = (Node *)malloc(sizeof(Node));
p1 = L->next;
p2 = p1->next;
p1->next = NULL;
p3 = p2->next;
while(p3 != NULL)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
L->next = p2;
return L;
}
int main()
{
LinkList L1 = CreateFromTail();
PrintLinkList(L1);
DelList(L1,len - 2);
puts("");
LinkList L2 = ReverseLinkList(L1);
PrintLinkList(L1);
return 0;
}
源代码2
采用时间超限问题处理方法二:
#include <stdio.h>
#include <malloc.h>
typedef struct Node
{
int data;
struct Node *next;
}Node, *LinkList;
int len = 0;
void CreatLinklist(LinkList L)
{
Node *p = NULL,*r = L;
char c;
while(1) {
p = (Node *)malloc(sizeof(Node));
scanf("%d",&p->data);
c = getchar();
p->next = NULL;
r->next = p;
r = p;
len ++;
if(c != ' ')
break;
}
}
void printfLinkList(LinkList L)
{
Node *p = L->next;
while(p != NULL) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
void delet3(LinkList L)
{
int i = 0;
Node *p = L;
while(i != len - 3 && p != NULL)
{
i ++;
p = p->next;
}
p->next = p->next->next;
}
int main()
{
Node *p1 = NULL,*p2 = NULL,*p3 = NULL;
LinkList L = (Node *)malloc(sizeof(Node));
L->next = NULL;
CreatLinklist(L);
printfLinkList(L);
delet3(L);
p1 = L->next;
p2 = p1->next;
p1->next = NULL;
p3 = p2->next;
while(p3 != NULL){
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
L->next = p2;
printfLinkList(L);
return 0;
}