读取一组电话号码簿(由姓名和手机号码组成),将重复出现的项删除(姓名和电话号码都相同的项为重复项,只保留第一次出现的项),并对姓名相同手机号码不同的项进行如下整理。
2017-09-06 23:13
3739 查看
读取一组电话号码簿(由姓名和手机号码组成),将重复出现的项删除(姓名和电话号码都相同的项为重复项,只保留第一次出现的项),并对姓名相同手机号码不同的项进行如下整理:首次出现的项不作处理,第一次重复的姓名后面加英文下划线字符_和数字1,第二次重复的姓名后面加英文下划线字符_和数字2,依次类推。号码簿中姓名相同的项数最多不超过10个。最后对整理后的电话号码簿按照姓名进行从小到大排序。若输入没有指定排序算法,则只输出排序后的电话号码簿;若输入指定了快速排序算法,则按指定算法按排序键值先输出进行第一趟快速排序后的结果(即只输出姓名),然后输出排序后的电话号码簿。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Phone_struct
{
char sName[20];
char sTel[12];
}PHONE, *PPHONE;
//输出函数
int output_phone(PPHONE pMyPhone, int num)
{
int i = 0;
printf("\n
name phone\n");
for (int i = 0; i < num; i++)
{
printf("%22s %-15s\n", (pMyPhone[i]).sName, (pMyPhone[i]).sTel);
}
return 0;
}
//delete repert index < len
int delete_by_index(PPHONE * pMyPhone, int *Len, int index)
{
int i = 0;
PPHONE pMy_Phone = *pMyPhone;
PPHONE tmp_phone = NULL;
int len = (*Len);
if (index = len - 1)
{
tmp_phone = (PPHONE)&(pMy_Phone[index]);
strcpy(tmp_phone->sName,"");
strcpy(tmp_phone->sTel, "");
(*Len)--; //总数减一
return 0;
}
for (i = index; i+1 < len; i++)
{
strcpy(pMy_Phone[i].sName, pMy_Phone[i + 1].sName);
strcpy(pMy_Phone[i].sTel, pMy_Phone[i + 1].sTel);
}
tmp_phone = (PPHONE)&(pMy_Phone[index]);
strcpy(tmp_phone->sName, "");
strcpy(tmp_phone->sTel, "");
(*Len)--; //总数减一
return 0;
}
//去重
int clear_repeat(PPHONE *pMyPhone, int *Num)
{
PPHONE pMy_Phone = *pMyPhone;
int i = 0;
int j = 0;
int repeat_count = 0; //计数,是否超过10次
int num = (*Num);
int move_flag = 0;
char sTmp[10] = "";
if (num < 2)
{
return 0;
}
for (i = 0; i < num; i++)
{
//pMyPhone[i]
repeat_count = 0;
for (j = i + 1; j < num; j++)
{
if (move_flag == 1)
{
j--;
move_flag = 0;
}
if ( strcmp(pMy_Phone[i].sName, pMy_Phone[j].sName) == 0) // sName same
{
if (strcmp(pMy_Phone[i].sTel, pMy_Phone[j].sTel) == 0)// sName same && sTel same
{
//delete
delete_by_index(pMyPhone, Num, j);
move_flag = 1;
}
else // sName same ,but sTel no same
{
//add _1 _2
repeat_count++;
if (repeat_count > 10) //重复超过10个
{
//delete
delete_by_index(pMyPhone, Num, j);
move_flag = 1;
}
else
{
strcpy(sTmp,"");
sprintf(sTmp,"_%d",repeat_count);
strcat(pMy_Phone[j].sName,sTmp);
}
}
}
}
}
return 0;
}
int phone_change(PPHONE phone1, PPHONE phone2)
{
char sName_tmp[21] = "";
char sTel_tmp[12] = "";
strcpy(sName_tmp, phone2->sName);
strcpy(sTel_tmp, phone2->sTel);
strcpy(phone2->sName, phone1->sName);
strcpy(phone2->sTel, phone1->sTel);
strcpy(phone1->sName, sName_tmp);
strcpy(phone1->sTel, sTel_tmp);
return 0;
}
//冒泡排序
int my_maopao_sort(PPHONE* pMyPhone, int iNum)
{
PPHONE pMy_Phone = (*pMyPhone);
int i = 0;
int j = 0;
for (i = 0; i < iNum-1; i++)
{
for (j = 0; j < iNum -1 -i;j++)
{
if (strcmp(pMy_Phone[j].sName, pMy_Phone[j+1].sName) > 0)
{
phone_change(&(pMy_Phone[j]), &(pMy_Phone[j + 1]));
}
}
}
return 0;
}
int phone_copy(PPHONE dis_phone, PPHONE src_phone)
{
strcpy(dis_phone->sName, src_phone->sName);
strcpy(dis_phone->sTel,src_phone->sTel);
return 0;
}
int phone_cmp(PPHONE phone1, PPHONE phone2)
{
if (strcmp(phone1->sName, phone2->sName) > 0)
return 1;
else if (strcmp(phone1->sName, phone2->sName) == 0)
return 0;
else //(strcmp(phone1->sName, phone2->sName) < 0)
return -1;
}
//qsort
int my_qsort(PPHONE *pMyPhone, int left, int right, int first_flag = 0)
{
PPHONE pMy_Phone = (*pMyPhone);
PHONE phone_flag;
int iRight = right;
int iLeft = left;
if (left < right)
{
phone_copy(&phone_flag, &(pMy_Phone[iLeft])); //
while (iLeft < iRight)
{
while ((iLeft < iRight) &&
((phone_cmp(&pMy_Phone[iRight], &phone_flag) >0) || (phone_cmp(&pMy_Phone[iRight], &phone_flag) == 0)))
{
iRight--;
}
if (iLeft < iRight)
{
phone_change(&pMy_Phone[iLeft], &pMy_Phone[iRight]);
iLeft++;
}
while (iLeft <iRight &&
((phone_cmp(&pMy_Phone[iLeft], &phone_flag) < 0) || (phone_cmp(&pMy_Phone[iLeft], &phone_flag) == 0)))
{
iLeft++;
}
if (iLeft < iRight)
{
phone_change(&pMy_Phone[iRight], &pMy_Phone[iLeft]);
iRight--;
}
}
phone_copy(&pMy_Phone[iLeft], &phone_flag); //
if (first_flag == 1)
{
printf("---");
output_phone(*pMyPhone, right + 1);
first_flag = 0;
}
my_qsort(pMyPhone, left, iLeft-1 );
my_qsort(pMyPhone, iLeft+1 , right);
}
return 0;
}
int main()
{
PPHONE pMyPhone;
int iSort_flag = 0;
int iNum = 0;
int i = 0;
int input_erro_flag = 0;
//输入 数量和排序算法
printf("please input num and sort method(1 is qsort,other is default sort method):\n");
scanf("%d %d", &iNum, &iSort_flag);
//开辟空间
pMyPhone = (struct Phone_struct*)malloc(sizeof(struct Phone_struct) * iNum);
printf("start input:\n");
//开始等待输入数据并存数据
for (i = 0; i < iNum; i++)
{
scanf_s("%s %s", pMyPhone[i].sName, 21, pMyPhone[i].sTel, 12);
fflush(stdin);
}
printf("input end\n");
//输出
//output_phone(pMyPhone,iNum);
//去重
clear_repeat(&pMyPhone, &iNum);
//排序
if (iSort_flag == 0)
{
my_maopao_sort(&pMyPhone, iNum);
}
else
{
my_qsort(&pMyPhone,0,iNum-1,1);
}
//输出
output_phone(pMyPhone, iNum);
free(pMyPhone);
pMyPhone = NULL;
return 0;
}
相关文章推荐
- 定义一个字符串类DelSameStr,从左到右对字符串中每个字符删除其后所有相同的字符,只留下第一次出现的那一个。例如,若字符串为”cocoon”,删除重复出现的字符后,其结果是字符串”con”
- java 集合 从类似如下的文本文件中读取出所有的姓名,并打印出重复的 * 姓名和重复的次数,并按重复次数排序:
- Java实现单链表(已排序)去重(保留重复元素第一次出现的节点)
- asp两个数组如何进行比较,剔除相同,保留不同
- 第一次发博客,新手初试啊,题目如下:有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
- 从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数
- 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从
- sqlserver 表查询锁与解锁以及删除重复数据(主键不同,其他数据都相同的数据)
- C语言:编写程序求解:有1,2,3,4,个数字,将组成互不相同且无重复数字出现的三位数打印出来
- 根据输入框的输入内容的不同,来检索本地通讯录,是按照姓名,还是手机号码!
- 编写一个学生信息管理系统:学生信息包括有(学生学号、姓名、性别、手机号码),系统以学生对象数组的方式存储学生信息 (初始数组为10个元素,每当数组存储满时,需要进行扩容,规则可以为翻倍也可以固定增长
- 登录时,需要对手机号码和验证码、QQ号码进行验证,代码如下
- 给定一个字符串,去重(重复的字符只保留第一次出现的)
- 字典序问题。在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1
- 使用倒序循环删除list中重复的相同元素 、 string的split使用、返回list(string)中出现多次的某元素的indexs...
- 面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序
- 字典序问题。在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1
- mysql,oracle里删除重复记录,只保留一条(除了自增长字段,其他的字段完全相同为相同记录)
- 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则: 1、仅压缩连续重复出现的字符。比如字符串"abcbc
- C语言:编写程序求解:有1,2,3,4,个数字,将组成互不相同且无重复数字出现的三位数打印出来