设计一个算法,判断一个单链表中各个结点值是否有序。程序框架如下:
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct link_node{
datatype info;
struct link_node *next;
}node;
typedef node *linklist;
linklist creatbyqueue()
{
linklist head,r,s;
datatype x;
head=r=(linklist)malloc(sizeof(node));
head->next=NULL;
printf("请输入整数序列(空格分开,以0结束):\n");
scanf("%d",&x);
while (x!=0)
{
s=(linklist)malloc(sizeof(node));
s->info=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return head;
}
linklist creatbystack()
{
linklist head,s;
datatype x;
head=(linklist)malloc(sizeof(node));
head->next=NULL;
printf("请输入整数序列(空格分开,以0结束):\n");
scanf("%d",&x);
while (x!=0)
{
s=(linklist)malloc(sizeof(node));
s->info=x;
s->next=head->next;
head->next=s;
scanf("%d",&x);
}
return head;
}
void print(linklist head)
{
linklist p;
int i=0;
p=head->next;
printf("List is:\n");
while(p)
{
printf("%7d",p->info);
i++;
if (i%10==0) printf("\n");
p=p->next;
}
printf("\n");
}
/请将本函数补充完整,并进行测试/
int issorted(linklist head,char c)
{
//待补充
}
int main() /测试程序/
{ linklist head;
head=creatbyqueue();
print(head);
if (issorted(head,'a')) printf("单链表head是升序排列的!\n");
else
if (issorted(head,'d')) printf("单链表head是降序排列的!\n");
else printf("单链表head是无序的!\n");
return 0;
}
输入格式:
输入一个单链表序列。
输出格式:
输出单链表是否有序。
输入样例:
11 22 33 44 55 0
输出样例:
请输入整数序列(空格分开,以0结束):
List is:
11 22 33 44 55
单链表head是升序排列的!
供参考:
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct link_node {
datatype info;
struct link_node* next;
}node;
typedef node* linklist;
linklist creatbyqueue()
{
linklist head, r, s;
datatype x;
head = r = (linklist)malloc(sizeof(node));
head->next = NULL;
printf("请输入整数序列(空格分开,以0结束):\n");
scanf("%d", &x);
while (x != 0)
{
s = (linklist)malloc(sizeof(node));
s->info = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return head;
}
linklist creatbystack()
{
linklist head, s;
datatype x;
head = (linklist)malloc(sizeof(node));
head->next = NULL;
printf("请输入整数序列(空格分开,以0结束):\n");
scanf("%d", &x);
while (x != 0)
{
s = (linklist)malloc(sizeof(node));
s->info = x;
s->next = head->next;
head->next = s;
scanf("%d", &x);
}
return head;
}
void print(linklist head)
{
linklist p;
int i = 0;
p = head->next;
printf("List is:\n");
while (p)
{
printf("%7d", p->info);
i++;
if (i % 10 == 0) printf("\n");
p = p->next;
}
printf("\n");
}
// 请将本函数补充完整,并进行测试
int issorted(linklist head, char c)
{
//待补充
int nTime = 0, flgL = 0, flgR = 0;
if (head == NULL || head->next == NULL)
return 0;
linklist p = head->next;
while (p->next) {
if (p->info < p->next->info)
flgR++;
else if (p->info > p->next->info)
flgL++;
else
return 0; //相等
if (flgR && flgL)
return 0;
nTime++;
p = p->next;
}
if (nTime == flgR)
return c == 'a';
else if (nTime == flgL)
return c == 'd';
else
return 0;
}
int main() //测试程序
{
linklist head;
head = creatbyqueue();
print(head);
if (issorted(head, 'a'))
printf("单链表head是升序排列的!\n");
else
if (issorted(head, 'd'))
printf("单链表head是降序排列的!\n");
else
printf("单链表head是无序的!\n");
return 0;
}