#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxlen 100
typedef struct
{
char number[20];
char name[20];
char sex[3];
char phone[15];
char addr[30];
} linkman;
typedef struct
{
linkman *elem;
int length;
} SeqList;
SeqList *L;
void SeqList_Save_2_Txt(SeqList *L)
{
FILE *f1;
if ((f1 = fopen("Linkman.txt", "a+")) == NULL) // a+是向文件中追加内容的操作
{
printf("文件打开失败");
}
for (int j = 0; j < L->length; j++)
{
fprintf(f1, "%s %s %s %s %s\n", L->elem[j].number, L->elem[j].name, L->elem[j].sex, L->elem[j].phone,
L->elem[j].addr);
if (fclose(f1))
printf("文件关闭失败");
}
}
void display_Node(SeqList L, int i, int k)
{
printf("搜索结果查询到第%d个联系人信息为:\n", k);
printf("编号:%s 姓名: %s 性别:%s 电话:%s 地址:%s \n", L.elem[i].number, L.elem[i].name, L.elem[i].sex,
L.elem[i].phone, L.elem[i].addr);
}
void alter(SeqList *L, char num[])
{
int i;
for (i = 0; i < L->length; i++)
{
if (strcmp(L->elem[i].number, num) == 0)
break;
}
if (i == L->length)
printf("输入序号错误,请重新输入");
printf("请输入修改后的联系人的信息。\n");
printf("编号:\n");
scanf("%s", &L->elem[i].number);
printf("姓名:\n");
scanf("%s", &L->elem[i].name);
printf("性别:\n");
scanf("%s", &L->elem[i].sex);
printf("电话:\n");
scanf("%s", &L->elem[i].phone);
printf("地址:\n");
scanf("%s", &L->elem[i].addr);
}
SeqList *createSeqList()
{
int i, n;
L = (SeqList *)malloc(maxlen * (sizeof(L)));
if (!L->length)
exit(0);
L->length = 0;
printf("请输入人数:\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("请输入第%d号联系人的信息。\n", i + 1);
printf("编号:\n");
scanf("%s", &L->elem[L->length].number);
printf("姓名:\n");
scanf("%s", &L->elem[L->length].name);
printf("性别:\n");
scanf("%s", &L->elem[L->length].sex);
printf("电话:\n");
scanf("%s", &L->elem[L->length].phone);
printf("地址:\n");
scanf("%s", &L->elem[L->length].addr);
L->length++;
}
printf("初始化成功!\n");
return L;
}
linkman seqListGet(SeqList L, int index) //调出结构体中的一个数据单元
{
linkman res;
if (index <= L.length && index >= 0)
res = L.elem[index];
return res;
}
void displayList(SeqList L)
{
int i;
for (i = 0; i < L.length; i++) //利用seqListGet()函数将所有通讯录人员的信息调出
{
linkman res = seqListGet(L, i);
printf("编号:%s 姓名: %s 性别:%s 电话:%s 地址:%s \n", res.number, res.name, res.sex, res.phone, res.addr);
}
return;
}
//各种不同查找方式都采用字符串比对的方式如果完全相同就是查找成功
void name_search(SeqList L)
{
char temp_name[maxlen];
int i, k = 0;
printf("请输入姓名:\n");
scanf("%s", &temp_name);
for (i = 0; i < L.length; i++)
{
if (strcmp(L.elem[i].name, temp_name) == 0)
{
k++; //如果查不到那么就不会运行此代码,k的结果自然就是0
display_Node(L, i, k);
}
}
if (k == 0)
{
printf("查找失败,表中无此项数据。\n");
}
return;
}
void phone_search(SeqList L)
{
char temp_name[maxlen];
int i, k = 0;
printf("请输入电话号码:\n");
scanf("%s", &temp_name);
for (i = 0; i < L.length; i++)
{
if (strcmp(L.elem[i].phone, temp_name) == 0)
{
k++;
display_Node(L, i, k);
}
}
if (k == 0)
{
printf("查找失败,表中无此项数据。\n");
}
return;
}
void addr_search(SeqList L)
{
char temp_name[maxlen];
int i, k = 0;
printf("请输入地址:\n");
scanf("%s", &temp_name);
for (i = 0; i < L.length; i++)
{
if (strcmp(L.elem[i].addr, temp_name) == 0)
{
k++;
display_Node(L, i, k);
}
}
if (k == 0)
{
printf("查找失败,表中无此项数据。\n");
}
return;
}
void number_search(SeqList L)
{
char temp_name[maxlen];
int i, k = 0;
printf("请输入编号:\n");
scanf("%s", &temp_name);
for (i = 0; i < L.length; i++)
{
if (strcmp(L.elem[i].number, temp_name) == 0)
{
k++;
display_Node(L, i, k);
}
}
if (k == 0)
{
printf("查找失败,表中无此项数据。\n");
}
return;
}
SeqList add_linkmans(SeqList *L, int i)
{
int j;
if (i < 1 || i > L->length + 1)
{
printf("位置不存在!重新输入!\n");
return *L;
}
for (j = L->length; j >= i; j--)
{ //倒序后移,以防覆盖旧值
strcpy(L->elem[j].number, L->elem[j - 1].number);
strcpy(L->elem[j].name, L->elem[j - 1].name);
strcpy(L->elem[j].addr, L->elem[j - 1].addr);
strcpy(L->elem[j].phone, L->elem[j - 1].phone);
strcpy(L->elem[j].sex, L->elem[j - 1].sex);
}
printf("请输入第%d号联系人的信息。\n", i);
printf("编号:\n");
scanf("%s", &L->elem[i - 1].number);
printf("姓名:\n");
scanf("%s", &L->elem[i - 1].name);
printf("性别:\n");
scanf("%s", &L->elem[i - 1].sex);
printf("电话:\n");
scanf("%s", &L->elem[i - 1].phone);
printf("地址:\n");
scanf("%s", &L->elem[i - 1].addr);
L->length++;
printf("插入成功!\n");
return *L;
}
SeqList del_linkman(SeqList *L, int n)
{
int j;
if (!L->length)
{
printf("表空!\n");
return *L;
}
if (n < 1 || n > L->length)
printf("位置不存在!重新输入!\n");
for (j = n; j < L->length; j++)
{ //正序前移
strcpy(L->elem[j - 1].name, L->elem[j].name);
strcpy(L->elem[j - 1].number, L->elem[j].number);
strcpy(L->elem[j - 1].addr, L->elem[j].addr);
strcpy(L->elem[j - 1].phone, L->elem[j].phone);
strcpy(L->elem[j - 1].sex, L->elem[j].sex);
}
L->length--;
printf("删除完成!\n");
return *L;
}
int main()
{
char num[maxlen];
int option, i, j, search_option;
int end_sign = 1;
while (end_sign) // end_sign为结束标志,如果输入退出那么置0
{
printf("1、添加联系人信息构建顺序表\n");
printf("2、输出联系人信息\n");
printf("3、指定查找方式查找联系人信息\n");
printf("4、插入联系人信息\n");
printf("5、删除联系人信息\n");
printf("6、输出联系人总人数\n");
printf("7、将所有联系人信息保存到txt文档中\n");
printf("8、修改指定序号的数值\n");
printf("9、退出\n");
printf("请选择要操作的序号!\n");
scanf("%d", &option);
switch (option)
{
case 1:
createSeqList();
break;
case 2:
displayList(*L);
break;
case 3:
printf("请输入查找方式!");
printf("1 按编号查询。");
printf("2 按姓名查询。");
printf("3 按电话号码查询。");
printf("4 按地址查询。\n");
scanf("%d", &search_option);
switch (search_option)
{
case 1:
number_search(*L);
break;
case 2:
name_search(*L);
break;
case 3:
phone_search(*L);
break;
case 4:
addr_search(*L);
break;
default:
printf("输入错误!");
break;
}
break;
case 4:
printf("请输入插入位置!\n");
scanf("%d", &i);
add_linkmans(L, i);
break;
case 5:
printf("请输入删除位置!\n");
scanf("%d", &j);
del_linkman(L, j);
break;
case 6:
printf("联系人总人数为%d\n", L->length);
break;
case 7:
SeqList_Save_2_Txt(L);
break;
case 8:
printf("请输入修改值的的序号\n");
scanf("%s", &num);
alter(L, num);
break;
case 9:
end_sign = 0;
break;
default:
break;
}
}
return 0;
}
顺序表结构实现简单通讯录(有增删改查和将数据写入txt文档中的功能)C语言
于 2022-08-13 04:21:30 首次发布