acm 帮找错。。。 老题目 487-3279
程序代码:
//--------------------------------------------------------------------------------------------------------- //解题步骤: // 1,每输入一个合法的字符串,就转换成标准格式 // 2,把格式后的字符串,插入链表 //insert函数工作步骤: // 1,判断是否为第一次插入,是则直接插入 // 2,维护一个递增链表。 // 3,遍历链表,比较t与结点数据域的大小,来决定互换 // 4,遍历结束,把最大的元素保存到t,在插入表尾 //--------------------------------------------------------------------------------------------------------- #include "stdio.h" #include "string.h" #include "stdlib.h" #include <time.h> //测试程序而添加的头 typedef struct lnode { char data[9]; int counter; struct lnode *next; }lnode,*linklist; void changetostande(char*,char*); int insert(linklist,char* ); int main() { linklist lodeptr,p; lnode codelode; long i; int j; char t[9],s[256]; codelode.next=0; p=lodeptr=&codelode; scanf("%d",&i); if (i>100000) return 0; while (i--) { int j=0; while (j<8) { s[j++]= (char)((rand()%10)+48);////测试程序而添加的 } changetostande(s,t);//转换成标准格式 ***-**** //printf("%s\n",t); j=insert(lodeptr,t);//在插入链表 } if (!j) { printf("%s\n","No duplicates."); } while (p->next) { p=p->next; printf("%s %d\n",p->data,p->counter); } return 0; } int insert(linklist lodeptr,char *t) { linklist p,q,r; int i=0; static int n=0 ,j=0; char max1[9]; p=lodeptr->next; if (!n)//第一次时,直接插入 { n=1; q=malloc(sizeof(lnode)); q->next=lodeptr->next; q->counter=0; strcpy(q->data,t); lodeptr->next=q; return 0; } else while (p)//否则遍历链表 { i=strcmp(t,p->data); if (i==0) { p->counter++; return j=1; } else if(i==1) { r=p; p=p->next; } else { strcpy(max1,p->data); strcpy(p->data,t); strcpy(t,max1); r=p; p=p->next; } }//while 维护一个递增链表把最大的换出来 q=malloc(sizeof(lnode)); strcpy(q->data,t); q->counter=0; q->next=r->next; r->next=q;//再插到表尾 return j; } void changetostande(char* s,char* t) {//这玩意就没改了,本来想换个比较"0000 1111 2ABC 3DEF 4GHI 5JKL 6NMO 7PRS 8TUV 9WXY",实现功能的。 int n=0; while (*s && n<8) { if (n==3) { *(t++)='-'; n++; *(s--); } else { switch (*s) { case 'A': case 'B': case 'C': case '2': ++n; *(t++)='2'; break; case 'D': case 'E': case 'F': case '3': ++n; *(t++)='3'; break; case 'G': case 'H': case 'I': case '4': ++n; *(t++)='4'; break; case 'J': case 'K': case 'L': case '5': ++n; *(t++)='5'; break; case 'N': case 'M': case 'O': case '6': ++n; *(t++)='6'; break; case 'P': case 'R': case 'S': case '7': ++n; *(t++)='7'; break; case 'T': case 'U': case 'V': case '8': ++n; *(t++)='8'; break; case 'W': case 'X': case 'Y': case '9': ++n; *(t++)='9'; break; case '0': ++n; *(t++)='0'; break; case '1': ++n; *(t++)='1'; break; default: break; }//switch }//if *(s++); }//while *t=0; }一次处理10w条记录,要3分钟的样子
怎么不给个超时