1.静态版本
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#define max 100
typedef struct peo //人的信息
{
char name[20];
int age;
char sex[10];
char tele[12];
char addr[30];
}peo; //把struct peo重命名(简化)为 peo
typedef struct contact //通讯录信息
{
peo data[max];
int count ; //count负责记录当前通讯录人数
}contact;
void initcontact(contact* con);
void addcontact(contact* con);
void showcontact(contact* con);
void delcontact(contact* con);
void searchcontact(contact* con);
void modifycontact(contact* con);
void sortcontact(contact* con);
#define _CRT_SECURE_NO_WARNINGS
#include"add.h"
void initcontact(contact* con)
{
con->count = 0;
memset(con->data, 0, sizeof(con->data));
}
void addcontact(contact* con)
{
if (con->count == max)
{
printf("已经装不下了~\n");
return;
}
printf("输入名字:");
scanf("%s", con->data[con->count].name);
printf("输入年龄:");
scanf("%d", &(con->data[con->count].age)); //别忘了取地址
printf("输入性别:");
scanf("%s", con->data[con->count].sex);
printf("输入手机号:");
scanf("%s", con->data[con->count].tele);
printf("输入地址:");
scanf("%s", con->data[con->count].addr);
(con->count)++;
printf("添加成功\n");
}
void showcontact(const contact* con)
{
int i = 0;
printf("%-20s\t %-5s\t %-5s\t %-12s\t %-30s\n", "名字", "年龄", "性别", "电话", "地址");
for (i = 0; i < con->count; i++)
{
printf("%-20s\t %-5d\t %-5s\t %-12s\t %-30s\n",
con->data[i].name,
con->data[i].age,
con->data[i].sex,
con->data[i].tele,
con->data[i].addr);
}
printf("显示完毕\n");
}
void searchcontact(contact* con)
{
char name[20] = { 0 };
printf("输入查找人的名字:");
scanf("%s", name);
int pos = findbyname(&con, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
else
{
printf("%-20s\t %-5s\t %-5s\t %-12s\t %-30s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-20s\t %-5d\t %-5s\t %-12s\t %-30s\n",
con->data[pos].name,
con->data[pos].age,
con->data[pos].sex,
con->data[pos].tele,
con->data[pos].addr);
}
}
static int findbyname(contact* con, char name[])
{
int i = 0;
for (i = 0; i < con->count; i++)
{
if (strcmp(con->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void modifycontact(contact* con)
{
//先查找
char name[20] = { 0 };
printf("输入修改的人的名字:");
scanf("%s", name);
int pos = findbyname(&con, name);
if (pos == -1)
{
printf("要修改的人不存在\n");
return;
}
else
{
printf("输入名字:");
scanf("%s", con->data[pos].name);
printf("输入年龄:");
scanf("%d", &(con->data[pos].age)); //别忘了取地址
printf("输入性别:");
scanf("%s", con->data[pos].sex);
printf("输入手机号:");
scanf("%s", con->data[pos].tele);
printf("输入地址:");
scanf("%s", con->data[pos].addr);
printf("修改成功!\n");
}
}
void delcontact( contact* con)
{
char name[20] = { 0 };
if (con->count == 0)
{
printf("没得可删\n");
return;
}
printf("输入删除人的名字:");
scanf("%s", name);
//先查找
int pos=findbyname(&con, name);
if (pos == -1)
{
printf("要删除的人不存在\n");
return;
}
//再删除
int i = 0;
for (i = pos; i < con->count-1; i++) //一个个往前覆盖就是删除了
{
con ->data[i] = con->data[i + 1];
}
(con->count)--;
}
int cmp_peo_byname(const void* e1,const void* e2)
{
return strcmp(((peo*)e1)->name, ((peo*)e2)->name);
}
void sortcontact(contact* con)
{
qsort(con->data,con->count,sizeof(peo), cmp_peo_byname);
printf("排序完了!\n");
}
#include"add.h"
void menu()
{
printf("*****************************\n");
printf("********* 1.add ******\n");
printf("********* 2.del ******\n");
printf("********* 3.search ******\n");
printf("********* 4.modify ******\n");
printf("********* 5.show ******\n");
printf("********* 6.sort ******\n");
printf("********* 0.exit ******\n");
printf("*****************************\n");
}
enum option
{
exit, //枚举中间用逗号隔开
add,
del,
search,
modify,
show,
sort
};
int main()
{
peo data[100]; //结构体数组,类似于int[100]
contact con;
initcontact(&con);
int count = 0;
int input = 0;
do
{
menu();
printf("请选择: ");
scanf("%d", &input);
switch (input)
{
case add:
addcontact(&con);
break;
case del:
delcontact(&con);
break;
case search:
searchcontact(&con);
break;
case modify:
modifycontact(&con);
break;
case show:
showcontact(&con);
break;
case sort:
sortcontact(&con);
break;
case exit:
printf("退出通讯录\n");
break;
default:
printf("输入错误,重新输入:\n");
break;
}
} while (input);
return 0;
}
2.动态版本
#define max 100
typedef struct peo //人的信息
{
char name[20];
int age;
char sex[10];
char tele[12];
char addr[30];
}peo; //把struct peo重命名(简化)为 peo
typedef struct contact
{
peo* data; //把数组改成指针,方便以后的扩容
int count;
int capacity; //当前通讯录的容量
}contact;
void initcontact(contact* con)
{
con->count = 0;
con->data = (peo*)calloc(3 , sizeof(peo));
if (con->data == NULL)
{
printf("初始化出现错误:%s\n", strerror(errno));
return;
}
con->capacity = 3;
return ;
}
void addcontact(contact* con)
{
if (con->count == con->capacity)
{
peo* ptr=realloc(con->data, (con->capacity + 2) * sizeof(peo));
if (ptr == NULL)
{
printf("add出现错误:%s\n", strerror(errno));
return;
}
else
{
con->data = ptr;
con->capacity = con->capacity + 2;
}
}
printf("输入名字:");
scanf("%s", con->data[con->count].name);
printf("输入年龄:");
scanf("%d", &(con->data[con->count].age)); //别忘了取地址
printf("输入性别:");
scanf("%s", con->data[con->count].sex);
printf("输入手机号:");
scanf("%s", con->data[con->count].tele);
printf("输入地址:");
scanf("%s", con->data[con->count].addr);
(con->count)++;
printf("添加成功\n");
}
void destroy(contact* con) //添加在exit之前
{
free(con->data);
con->data = NULL;
}
3.车站表
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#define maxsize 100
typedef struct sss
{
int distance;
char name[50];
int number;
}chezhan; //定义基本的数据类型 如 "typedef int ElemType"
typedef struct ss
{
chezhan data[maxsize];
int length;
}SqList; //定义线性表的物理储存方式
//初始化车站
void initlist(SqList* L)
{
L->length = 0;
L->data[0].distance = 0;
strcpy(L->data[0].name, "未命名");
}
//增加车站
void End_Insert(SqList* L, int weizhi, int l, const char s[])
{
int n = weizhi;
weizhi--;
L->data[weizhi].distance = l;
L->data[weizhi].number = n; //第一站
strcpy(L->data[weizhi].name, s);
L->length++;
}
bool Insert(SqList* L)
{
const char s[50] = {0};
printf("输入站点名称:");
scanf("%s", s);
int weizhi = 0;
printf("输入战点号码:");
scanf("%d", &weizhi);
int l = 0;
printf("输入站点距离前一站的距离:");
scanf("%d", &l);
if (L->length + 1 == weizhi)
{
End_Insert(L,weizhi,l,s);
return true;
}
else if (L->length < weizhi)
{
return false;
}
else
{
int i = 0;
int n = weizhi;
weizhi--;
for (i = L->length; i > weizhi; i--)
{
L->data[i + 1] = L->data[i];
L->data[weizhi].distance = l;
L->data[weizhi].number = n;
strcpy(L->data[weizhi].name, s);
}
L->length++;
return true;
}
}
//删除车站
bool ListDelete(SqList* L)
{
int weizhi = 0;
printf("输入要删除战点号码:");
scanf("%d", &weizhi);
if (weizhi<1 || weizhi>L->length)
return false;
weizhi = weizhi - 1; //将逻辑符号转成数组下标(物理符号)
for (int i = weizhi; i < L->length; i++)
{
L->data[i] = L->data[i+1];
}
for (int i = weizhi; i < L->length; i++)
{
L->data[i].number--;
}
L->length--;
return true;
}
//按车站名字查找
int LocateElem_name(SqList* L)
{
const char s[50] = { 0 };
printf("输入站点名称:");
scanf("%s", s);
int i = 0;
for (i = 0; i < L->length; i++)
{
if (strcmp(L->data[i].name, s) == 0)
{
printf("找到了,车站名是%s,距离前一站是%d,这是第%d站\n", L->data[i].name, L->data[i].distance, L->data[i].number);
return i + 1; //返回逻辑序号
}
}
return 0; //查找失败
}
//按车站序号查找
int LocateElem_number(SqList* L,int weizhi)
{
int i = 0;
for (i = 0; i < L->length; i++)
{
if (weizhi == L->data[i].number)
{
return i + 1; //返回逻辑序号
}
}
return 0; //查找失败
}
//修改车站信息
void LocateElem_change(SqList* L)
{
int weizhi = 0;
printf("输入要修改的战点号码:");
scanf("%d", &weizhi);
const char s[50] = { 0 };
printf("输入修改后的站点名称:");
scanf("%s", s);
int l = 0;
printf("输入修改后的站点距离前一站的距离:");
scanf("%d", &l);
int t = LocateElem_number(L, weizhi)-1;
strcpy(L->data[t].name, s);
L->data[t].distance = l;
printf("修改成功\n");
}
//打印车站
void DisList(SqList* L)
{
for (int i = 0; i < L->length; i++)
{
printf("%d ", L->data[i].number);
printf("%d ", L->data[i].distance);
printf("%s \n", L->data[i].name);
}
printf("\n");
}
void menu()
{
printf("*****************************\n");
printf("******* 1.添加站点 ***\n");
printf("******* 2.删除站点 ***\n");
printf("******* 3.查找站点 ***\n");
printf("******* 4.修改站点 ***\n");
printf("******* 5.看看车表 ***\n");
printf("******* 0.退出选择 ***\n");
printf("*****************************\n");
}
int main()
{
SqList L;
initlist(&L);
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
Insert(&L);
break;
case 2:
ListDelete(&L);
break;
case 3:
LocateElem_name(&L);
break;
case 4:
LocateElem_change(&L);
break;
case 5:
DisList(&L);
break;
case 0:
printf("取消选择 \n");
break;
default:
printf("选择错误,请重新选择:");
}
} while (input);
return 0;
}