实验案例 7-4:恢复古诗 (考查链表排序)

    xiaoxiao2022-07-07  174

    解题思路:维护一个有序的碎片链表。即从第一个碎片开始,逐一扫描全部未排序的碎片,找到其头行能与当前有序表尾的碎片尾行匹配的碎片,将其贴到有序碎片链表尾;在结束匹配以后,再逐一扫描全部未排序的碎片,找到其尾行能与当前有序表头的碎片头行匹配的碎片,将其插到有序碎片链表头,直到全部碎片扫描完毕。

    #include <stdio.h> #include <string.h> #define MaxP 1000 #define MaxL 100 #define MaxC 80 struct PageType{ int next;/*记录下一页的位置,-1表示本页是最后一页,-2表示本页还未加入排序*/ char cont[MaxL][MaxC+1]; }Page[MaxP]; void ReadPages(int Pn,int Ln); int SortPages(int Pn,int Ln);/*返回首页的位置*/ void Output(int head,int Ln); int main(void) { int Pn,Ln; scanf("%d %d\n",&Pn,&Ln); ReadPages(Pn,Ln); Output(SortPages(Pn,Ln),Ln); return 0; } void ReadPages(int Pn,int Ln) { int i,j; for (i=0;i<Pn;i++) { for (j=0;j<Ln;j++) gets(Page[i].cont[j]); Page[i].next=-2; } } int SortPages(int Pn,int Ln) { int head,tail,i; head=tail=0; Page[0].next=-1; /* 本行代码与上一行代码表示当前有序的序列只有第0页*/ if (Pn == 1) return 0; /*从Page[0]开始向后排序*/ i=1; while(i!=tail) { if ((Page[i].next==-2)&&(!strcmp(Page[tail].cont[Ln-1],Page[i].cont[0]))) { Page[tail].next=i; tail=i; Page[tail].next=-1; } i = (i+1) % Pn; } /*从Page[0]开始向前排序*/ i=1; while(i!=head) { if ((Page[i].next==-2)&&(!strcmp(Page[head].cont[0],Page[i].cont[Ln-1]))) { Page[i].next=head; head=i; } i = (i+1) % Pn; } return head; } void Output(int head,int Ln) { int i,j; for (i=0;i<Ln;i++) printf("%s\n",Page[head].cont[i]); for (j=Page[head].next;j!=-1;j=Page[j].next) for(i=1;i<Ln;i++) printf("%s\n",Page[j].cont[i]); }
    最新回复(0)