判断带表头的单向循环链表La是否递增

来源:互联网 发布:linux下iscsi服务搭建 编辑:程序博客网 时间:2024/05/16 15:05

原题:编程判断带表头的单向循环链表La是否递增。

分析:判断链表是否递增由函数IsIncrease()实现,其算法思想:令p指向链表的第一个结点,即指向头结点的后继,如果p所指结点的值比其后继结点的值小,则p前进;如果最终p->next==L(注意此表是单循环链表),则说明表中任意两相临结点中,前一结点的值总小于后一结点的值,即链表是递增的。

#include<stdio.h>#include<malloc.h>#include<time.h>#include<stdlib.h>typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;int InitList1(LinkList &La)//随机生成链表,链表很可能无序{LinkList p,q;La=(LinkList)malloc(sizeof(LNode));La->data=-1;La->next=NULL;q=La;//q永远指向La的表尾srand((unsigned)time(NULL));for(int k=0;k<2;k++){p=(LinkList)malloc(sizeof(LNode));p->data=rand()%100*16+1;p->next=q->next;//将生成的新结点插入在表尾q->next=p;q=q->next;//q指向新的表尾}q->next=La;//表尾next指针指向表头,形成单循环链表return 1;}int InitList2(LinkList &L)//生成递增有序链表{LinkList p,q,pre;L=(LinkList)malloc(sizeof(LNode));//生成头结点L->data=-1;L->next=NULL;//头结点数据域值为-1srand((unsigned)time(NULL));for(int k=0;k<20;k++)//生成结点并插入链表{p=(LinkList)malloc(sizeof(LNode));p->data=rand()%100*16+1;p->next=NULL;if(L->next == NULL)//如果链表为空,则直接将结点插入作为第一个数据结点{L->next=p;p->next=NULL;}else{//如果链表不为空,则按数据域值从小到大有序的顺序插入pre=L;q=pre->next;while(q != NULL && p->data > q->data){//寻找插入位置pre=q;q=q->next;}//如果表中已有数据域值等于p的数据域值,则丢弃p,继续下次循环if(pre->data == p->data)continue;if(q != NULL && q->data == p->data)continue;if(pre->next == NULL){//如果pre指向尾结点了,则将p结点插入到表尾作新表尾pre->next=p;p->next=NULL;}else{//pre没有指向表尾,说明P结点应该插入在链表中,而不是在表尾p->next=pre->next;pre->next=p;}}}//查找链表的尾结点并使其指向头结点,从而链表变成单循环链表 pre=L->next;while(pre->next != NULL)pre=pre->next;pre->next=L;return 1;}int DisplayList(LinkList La){if(La->next == NULL){printf("当前链表为空!\n\n");return -1;}LinkList p=La;while(p->next != La){printf("%5d ->",p->data);p=p->next;}printf("%5d\n\n",p->data);return 1;}int IsIncrease(LinkList L)//判断链表是否是递增链表{LinkList p=L->next;while(p->data < p->next->data && p->next!=L)p=p->next;//如果前一个结点的值小于后一个结点的值,则p前进if(p->next == L)//如果p->next==L,则说明对于任意两相临结点{//前一结点的值总是小于后一结点的值,即链表是递增的printf("是递增链表!\n\n");return 1;}else{printf("不是递增链表!\n\n");return -1;}}int main(){LinkList La,Lb;InitList1(La);printf("链表La的数据为:\n");DisplayList(La);InitList2(Lb);printf("链表Lb的数据为:\n");DisplayList(Lb);printf("链表La");IsIncrease(La);printf("链表Lb");IsIncrease(Lb);return 1;}