12.3 实验二 线性表的链式存储结构
3. (必做题)设计并验证以下算法:判定带头结点单向链表L的数据元素是否为非递增有序。如果是非递增有序的,删除值相同的多余元素,并就地逆置删除后的链表L;如果不是非递增有序的,输出相应的提示信息。
(1) 根据键盘输入数据用尾插法建立带头结点单向链表L。
(2) 输出带头结点单向链表L、删除值相同多余元素后的单向链表L、就地逆置后的单向链表L。
#include<stdio.h>
#include<stdlib.h>
typedef struct date{
int num;
struct date *next;
} LinkList;
LinkList *creat(int n){
LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head; //若是空链表则头尾节点一样
for (int i = 0; i < n; i++) {
node = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &node->num);
end->next = node;
end = node;
}
end->next = NULL;//结束创建
return head;
}
bool panduan(LinkList *a)
{
bool flag = true;
LinkList *p = a->next;
while(p->next!=NULL)
{
LinkList *q = p->next;
if(q->num>=p->num)
{
p = p->next;
q = q->next;
}
else
{
flag = false;
break;
}
}
return flag;
}
void remove(LinkList *a) //链式表去重
{
LinkList *p = a->next;
while(p!=NULL)
{
LinkList *q = p;
LinkList *b = p->next;
while(b!=NULL)
{
if(b->num==p->num)
{
q->next = b->next;
b=q->next;
}
else
{
q=q->next;
b=b->next;
}
}
p=p->next;
}
LinkList *t = a->next;
printf("该非递增有序链表为:");
while(t!=NULL)
{
printf("%d ",t->num);
t = t->next;
}
printf("\n");
}
LinkList *zhuanzhi(LinkList *a)
{
LinkList *head, *node, *end;
head = (LinkList*)malloc(sizeof(LinkList));
end = head;
head->next = NULL;
LinkList *p = a->next;
while(p!=NULL)
{
LinkList *t;
t = (LinkList*)malloc(sizeof(LinkList));
t->num = p->num;
t->next=head->next;
head->next = t;
p = p->next;
}
return head;
}
void out(LinkList *b)
{
LinkList *t = b->next;
printf("该非递增有序链表逆置后为:");
while(t!=NULL)
{
printf("%d ",t->num);
t = t->next;
}
printf("\n");
}
int main()
{
int n;
printf("请输入元素个数n:");
scanf("%d",&n);
if(n<1)
{
printf("个数不能小于1!");
return 0;
}
printf("请输入这n个元素:");
LinkList *a = creat(n);
if(panduan(a) == true) {
printf("该链表不是非递增有序的!\n");
return 0;
}
else
{
remove(a);
LinkList *b = zhuanzhi(a);
out(b);
}
}