poj1002

#include<stdio.h> #include<stdlib.h> int map[25]= {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 0, 7, 7, 8, 8, 8, 9, 9, 9}; typedef struct LNode{ int data[8]; struct LNode *next; }; int main() { int row,c,tag,i,j,n,temp[7];//输入次数 n=0;//电话号码个数 LNode *head=0; //指向链表头节点 LNode *front= 0; //指向当前节点的前一位置 LNode *tail= 0; //指向当前遍历到的节点 scanf("%d/n",&row); if(row<=0&&row>100000) return 0; for(i=0; i<row; i++)//将有效输入存入temp数组 { for(j=0; (c= getchar())&&(c!='/n')&&(j<7); ) { if(c!='-') { if(c>='A'&&c<='Y')temp[j++]= map[c-'A']; else if(c>='0'&&c<='9')temp[j++]= c-'0'; } } if(n==0) //新建第一节点 { LNode *p= (LNode *)malloc(sizeof(LNode)); for(int j=0; j<7; j++) p->data[j]= temp[j]; p->data[7]= 1; p->next= 0; head= p; n++; continue; } else //新建非第一节点 { tag= -1; for(front= head,tail= head; tail!= 0; front= tail,tail= tail->next) { for(j=0; j<7; j++) { if(tail->data[j]>temp[j]) //找到的目标节点值大于temp { if(front==tail){tag=2;break;} else {tag=3;break;} } else if(tail->data[j]<temp[j]) //目标节点值小于temp { if(tail->next==0){tag= 0;break;} else break; } else if(j==6&&tail->data[j]==temp[j]){tag=1;tail->data[7]+=1;break;} //目标节点值等于temp } if(tag==-1)continue; //未找到插入点 else if(tag==1)break; //目标节点值等于temp else if(tag==0) //目标节点值小于temp { LNode *p= (LNode *)malloc(sizeof(LNode)); for(j=0; j<7; j++) p->data[j]= temp[j]; p->data[7]= 1; p->next= 0; tail->next= p; n++; break; } else if(tag==2) //找到的目标节点值大于temp,目标节点为头结点 { LNode *p= (LNode *)malloc(sizeof(LNode)); for(j=0; j<7; j++) p->data[j]= temp[j]; p->data[7]= 1; p->next= head; head= p; n++; break; } else if(tag==3) //找到的目标节点值大于temp,目标节点非头结点 { LNode *p= (LNode *)malloc(sizeof(LNode)); for(j=0; j<7; j++) p->data[j]= temp[j]; p->data[7]= 1; p->next= tail; front->next= p; n++; break; } } } } tag= 0; for(tail= head; tail!=0; tail= tail->next) //遍历链表输出 { if(tail->data[7]>1) { tag= 1; for(i=0; i<8; i++) { if(i==3)printf("-"); if(i==7)printf(" "); printf("%d",tail->data[i]); } printf("/n"); } } if(tag==0)printf("No duplicates."); } 

你可能感兴趣的:(poj1002)