最开始用了很原始的数据初始化方法,多谢dskit指点,现在已经改正为哈希字典了。因为在创建新节点的时候浪费时间比较严重,所以如果改成用向量会更好一些。
#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.");
}