设计并验证以下算法:判定带头结点单向链表L的数据元素是否为非递增有序。如果是非递增有序的,删除值相同的多余元素,并就地逆置删除后的链表L;如果不是非递增有序的,输出相应的提示信息。
(1) 根据键盘输入数据用尾插法建立带头结点单向链表L。
(2) 输出带头结点单向链表L、删除值相同多余元素后的单向链表L、就地逆置后的单向链表L。
#include"stdio.h"
#include"stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define ElemType int
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
InitList_List(LinkList *);
Create_List(LinkList);
void Print_List(LNode *);
int Check_List(LNode *);
Status Delete_samenum(LinkList);
Status ReverseList(LinkList);
void main()
{
LinkList head;
InitList_List(&head);
Create_List(head);
while(Check_List(head))
{
printf("该序列不是非递增有序,请重输\n");
Create_List(head);
}
printf("输出带头结点单项链表L\n");
Print_List(head);
printf("删除相同元素后的单链表L\n");
Delete_samenum(head);
Print_List(head);
printf("就地逆置后的单链表L\n");
ReverseList(head);
Print_List(head);
}
Status InitList_List(LinkList *head)
{
*head=(LinkList)malloc(sizeof(LNode));
(*head)->next=NULL;
return OK;
}
Status Create_List(LinkList head)
{
LinkList p,q;
int i;
p=head;
printf("输入个数\n");
scanf("%d",&i);
while(i,i--)
{
q=(LinkList)malloc(sizeof(LNode));
scanf("%d",&q->data);
p->next=q;
p=q;
}
p->next=NULL;
}
void Print_List(LNode *head)
{
LinkList p;
p=head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int Check_List(LNode *head)
{
LinkList p;
p=head->next;
while(p->next)
{if(p->data<p->next->data)
return OK;
else
p=p->next;
}
return ERROR;
}
Status Delete_samenum(LinkList head)
{
LinkList p,s;
p=head;
while(p->next)
{
s=p->next;
if(p->data==s->data)
{p->next=s->next;
free(s);
}
else
p=p->next;
}
return OK;
}
Status ReverseList(LinkList head)
{
LinkList q;
LinkList p=head->next;
head->next=NULL;
while(p)
{
q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
return OK;
}