文章中提到的代码模板可参考《简明数据结构》期末备考之链表专题
试题描述
先将键盘输入的一组整数依次存入单链表,然后删除其中的最大最小元素,最后将其余元素逆序输出。
样例输入
1 2 3 4 5 6
样例输出
5 4 3 2
语言
C
思路分析
将键盘输入的一组整数依次存入单链表,套用尾插法建立带头结点的单链表模板
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;
}
定义MAX和MIN两个变量,在读入元素时记录最大和最小值。
套用在带头结点的单链表中删除结点模板
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;
}
//对于异常的处理可以根据题目要求再自行完善
套用逆置带头结点的单链表模板
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;
}
源代码
以下代码未经OJ验证,测试样例运行正确。
#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct Node{
ElemType data;
struct Node *next;
}Node, *LinkList;
int len = 0;
int MIN;
int MAX;
LinkList CreateFromTail()
{
LinkList L;
int x;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
Node *r, *s;
r = L;
int flag = 1;
char c;
do{
scanf("%d",&x);
if(flag)
{
MIN = x;
MAX = x;
flag = 0;
}
else
{
if(MIN > x)
MIN = x;
if(MAX < x)
MAX = x;
}
s = (Node *)malloc(sizeof(Node));
s->data = x;
r->next = s;
r = s;
}while(getchar() != '\n');
r->next = NULL;
return L;
}
void DelList(LinkList L, int x)
{
Node *p,*r;
p = (Node *)malloc(sizeof(Node));
r = (Node *)malloc(sizeof(Node));
p = L;
while(p != NULL && p->next != NULL)
{
if(p->next->data == x)
{
r = p->next;
p->next = p->next->next;
free(r);
break;
}
p = p->next;
}
}
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);
//puts("");
//printf("%d %d\n",MIN,MAX);
DelList(L1, MIN);
//PrintLinkList(L1);
//puts("");
DelList(L1, MAX);
//PrintLinkList(L1);
ReverseLinkList(L1);
PrintLinkList(L1);
return 0;
}