初学不懂,请问这样的算是使用了链表吗?
/*以本班同学的具体数据为背景,设计一个本班同学通讯录
实现以下功能:
1) 通讯录编辑(添加、删除);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_LEN 40
#define ADDRESS_LEN 60
#define TEL_LEN 12
#define E_LEN 30
#define MAX 1000
//*****************函数声明*******************//
void menu();
void InitContact(struct Contact* ps);
void Add(struct Contact* p);
void Del(struct Contact* p);
void Moidfy(struct Contact* p);
void Search(struct Contact* p);
void Sort(struct Contact* p);
void Sort_by_name(struct Contact* p);
void Sort_by_tele(struct Contact* p);
int FindValue_1(struct Contact* p, char* name);
int FindValue_2(struct Contact* p, char* name);
void Show(struct Contact* p);
void LoadContact(Contact* p);
int SaveFILE(struct Contact* p);
//*****************联系人信息*****************//
struct people
{
char name; //姓名
char address; //地址
char telephone_num; //电话
int Postal; //邮编
char E_mail; //E-mail
};
//***************通讯录类型*****************//
struct Contact
{
struct people data; //存放1000个信息
int size; //记录当前结构体内已经有的元素个数
};
void menu()
{
printf("\n");
printf("---------------------------------\n");
printf("** 1. 添加联系人 **\n");
printf("** 2. 删除联系人 **\n");
printf("** 3. 查找联系人 **\n");
printf("** 4. 修改联系人 **\n");
printf("** 5. 显示所有联系人 **\n");
printf("** 6. 排序联系人 **\n");
printf("** 0. exit **\n");
printf("---------------------------------\n");
}
//***************初始化通讯录***************//
void InitContact(struct Contact* ps)
{
memset(ps->data, 0, sizeof(ps->data));
ps->size = 0;//通讯录最初只有0个元素
}
//**************添加联系人信息**************//
void Add(struct Contact *p)
{
if (p->size >= MAX)
printf("通讯录已满,无法增加\n");
else
{
printf("请输入姓名:>");
scanf("%s", p->data.name);
printf("请输入住址:>");
scanf("%s", p->data.address);
printf("请输入电话:>");
scanf_s("%s", p->data.telephone_num,12);
printf("请输入邮编:>");
scanf("%d", &p->data.Postal);
printf("请输入E-mail:>");
scanf("%s", p->data.E_mail);
p->size++;
printf("添加成功\n");
}
}
//**************删除联系人信息**************//
void Del(struct Contact* p)
{
char name;
int temp = 0;//用来确认是否删除
int flag = 0;
if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
printf("查找姓名:");
scanf("%s", name);
flag = FindValue_1(p, name);
if (flag == -1)
{
printf("联系人不存在!\n");
}
else
{
int i = 0;
for ( i = flag; i < p->size - 1; i++)
{
p->data = p->data;
}
p->size--;
printf("删除成功!\n");
}
}
}
//**************修改联系人信息**************//
void Moidfy(struct Contact* p)
{
float get = 0;
char name;
if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
printf("查找姓名:");
scanf("%s", name);
int flag = FindValue_1(p, name);
if (flag == -1)
printf("联系人不存在!\n");
else
printf("输入0退出修改,否则继续:>");
scanf("%f", &get);
if (get != 0)
{
printf("请输入姓名:>");
scanf("%s", p->data.name);
printf("请输入住址:>");
scanf("%s", p->data.address);
printf("请输入电话:>");
scanf_s("%s", p->data.telephone_num,12);
printf("请输入邮编:>");
scanf("%d", &p->data.Postal);
printf("请输入E-mail:>");
scanf("%s", p->data.E_mail);
printf("修改成功!");
}
}
}
//**************查找联系人信息**************//
void Search(struct Contact* p)
{
char name;
char telephone_num;
int select = 0;
int flag = 0;
printf("查找:\n\t 1.按姓名 2.按电话号码\n|>");
scanf("%d", &select);
if (select == 1)
{
scanf("%s", name);
flag = FindValue_1(p, name);
}
else if(select == 2)
{
scanf("%s", telephone_num);
flag = FindValue_2(p, telephone_num);
}
else
{
printf("输入错误\n");
flag = -1;
}
if (flag == -1)
{
printf("联系人不存在!\n");
}
else
{
printf("\t姓名:>");
printf("%s\n", p->data.name);
printf("\t住址:>");
printf("%s\n", p->data.address);
printf("\t电话:>");
printf("%s\n", p->data.telephone_num);
printf("\t邮编:>");
printf("%d\n", p->data.Postal);
printf("\tE-mail:>");
printf("%s\n", p->data.E_mail);
}
}
void Sort(struct Contact* p)
{
int select = 0;
printf("\t0.退出 1.按姓名 2.按电话号码\n|>");
do
{
scanf("%d", &select);
switch (select)
{
case 0: break;
case 1:
Sort_by_name(p);
break;
case 2:
Sort_by_tele(p);
break;
default:
printf("选择错误,请重新选择 ! \n");
break;
}
} while (select != 0);
}
//****************姓名排序并显示****************//
void Sort_by_name(struct Contact *p)
{
if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
inti, j;
for (i = 0; i < p->size - 1; i++)
{
for (j = 0; j < p->size - i - 1; j++)
{
if (strcmp(p->data.name, (p->data).name) > 0)
{
struct people temp;
temp = p->data;
p->data = p->data;
p->data = temp;
}
}
}
printf("排序成功!\n");
}
}
//****************电话排序并显示****************//
void Sort_by_tele(struct Contact* p)
{
if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
inti, j;
for (i = 0; i < p->size - 1; i++)
{
for (j = 0; j < p->size - i - 1; j++)
{
if (strcmp(p->data.telephone_num, (p->data).telephone_num) > 0)
{
struct people temp;
temp = p->data;
p->data = p->data;
p->data = temp;
}
}
}
printf("排序成功!\n");
}
}
//*****************按姓名查找****************//
int FindValue_1(struct Contact* p, char* name)
{
int i = 0;
for (i = 0; i < p->size; i++)
{
if (strcmp(p->data.name, name) == 0)
return i;
}
return -1;
}
//*****************按电话号码查找****************//
int FindValue_2(struct Contact* p, char* telephone_num)
{
int i = 0;
for (i = 0; i < p->size; i++)
{
if (strcmp(p->data.telephone_num, telephone_num) == 0)
return i;
}
return -1;
}
//***************显示通讯录*****************//
void Show(struct Contact* p)
{
if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
for (int i = 0; i < p->size; i++)
{
printf("%-10s%-10s%-10s%-10d%-10s\n ",
p->data.name,
p->data.address,
p->data.telephone_num,
p->data.Postal,
p->data.E_mail);
}
}
}
//***************读取通讯录*****************//
void LoadContact( struct Contact* p)
{
people tmp = { 0 };//临时变量tmp
FILE* FR = fopen("contact.txt", "rb");
if (FR == NULL)
{
printf("LoadContact::%s\n", strerror(errno));
return;
}
//读取文件,存放到通讯录中
while (fread(&tmp, sizeof(people), 1, FR))
{
p->data = tmp;
p->size++;
}
fclose(FR);
FR = NULL;
}
//****************保存通讯录*****************//
int SaveFILE(struct Contact *p)
{
FILE* fp = fopen("contact.txt", "w");
if (fp == NULL)
{
printf("SaveContact::%s\n", strerror(errno));
return -1;
}
//写通讯录中数据到为文件中
int i = 0;
for (i = 0; i < p->size; i++)
{
fwrite(&(p->data), sizeof(people), 1, fp);
}
printf("已保存联系人!\n");
fclose(fp);
fp = NULL;
return 0;
}
//***************主函数*****************//
int main()
{
int input = 0;
struct Contact con; //创建通讯录,里面包含1000个元素的数和size
InitContact(&con); //初始化通讯录
LoadContact(&con);
do
{
menu();
printf("请选择:>\n别输入字母哟!");
scanf("%d", &input);
switch (input)
{
case 1: Add(&con);
break;
case 2: Del(&con);
break;
case 3: Search(&con);
break;
case 4: Moidfy(&con);
break;
case 5: Show(&con);
break;
case 6: Sort(&con);
break;
case 0: printf("退出通讯录\n");
break;
default: printf("选择错误\n");
break;
}
} while (input);
SaveFILE(&con);
return 0;
} 本帖最后由 侃遍天下无二人 于 2022-7-15 20:14 编辑
链表还有容量上限吗,明显不是呀 //***************通讯录类型*****************//
struct Contact
{
struct people data; //存放1000个信息
int size; //记录当前结构体内已经有的元素个数
};
这不是数据结构静态数组么,而且还是个顺序表。。
单链表:
struct Contact
{
ElemType data; //你的people数据域
struct Contact *next //指针域,指向下一个数据结点
}Contact; 看起来就是一个结构体的数组而已,不像链表,一个链表至少要有表头表尾构成,而插入是根据表头表尾来了(俗成头插法和尾插法)。当然也有试验型的静态链表(只为概念而生,方便理解,实际程序不会用)。每次插入后都会移动节点的指针指向下一个节点,有点小复杂,建议画图理解。 这不算链表 而是数组! 线性表吧 本帖最后由 tfrist 于 2022-7-16 00:59 编辑
根据你的代码我修改了一下这样的话就是使用链表了。 一个简单的单向链表,和链表遍历。
我手头没有C的编译器,无法运行调试,你那边出现错误bug什么的 自己酌情修改吧。现在经常使用python,所以就在文本编辑器里面修改了你的代码,只修改了添加和删除功能,就算是一个概念代码来看吧!希望对你在概念上有所帮助。
/*
以本班同学的具体数据为背景,设计一个本班同学通讯录
实现以下功能:
1) 通讯录编辑(添加、删除);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_LEN 40
#define ADDRESS_LEN 60
#define TEL_LEN 12
#define E_LEN 30
#define MAX 1000
//*****************函数声明*******************//
void menu();
void InitContact(struct Contact* ps);
void Add(struct Contact* p);
void Del(struct Contact* p);
void Moidfy(struct Contact* p);
void Search(struct Contact* p);
void Sort(struct Contact* p);
void Sort_by_name(struct Contact* p);
void Sort_by_tele(struct Contact* p);
int FindValue_1(struct Contact* p, char* name);
int FindValue_2(struct Contact* p, char* name);
void Show(struct Contact* p);
void LoadContact(Contact* p);
int SaveFILE(struct Contact* p);
//*****************联系人信息*****************//
struct people
{
char name; //姓名
char address; //地址
char telephone_num; //电话
int Postal; //邮编
char E_mail; //E-mail
};
//***************通讯录类型*****************//
struct Contact
{
//struct people data; //存放1000个信息
struct people data; //存放1000个信息
int size; //记录当前结构体内已经有的元素个数
};
struct link
{
struct link *pNext;
struct Contact *pItem;
int count;
link()
{
pNext = 0;
pItem = new struct Contact();
};
};
void menu()
{
printf("\n");
printf("---------------------------------\n");
printf("** 1. 添加联系人 **\n");
printf("** 2. 删除联系人 **\n");
printf("** 3. 查找联系人 **\n");
printf("** 4. 修改联系人 **\n");
printf("** 5. 显示所有联系人 **\n");
printf("** 6. 排序联系人 **\n");
printf("** 0. exit **\n");
printf("---------------------------------\n");
}
//***************初始化通讯录***************//
void InitContact(struct link *link_header, struct Contact* ps)
{
memset(ps->data, 0, sizeof(ps->data));
ps->size = 0;//通讯录最初只有0个元素
}
//**************添加联系人信息**************//
void Add(struct link *link_header, struct Contact *p)
{
if (link_header->count >= MAX)
//if (p->size >= MAX)
printf("通讯录已满,无法增加\n");
else
{
struct link *new_item = new struct link();
printf("请输入姓名:>");
//scanf("%s", p->data.name);
scanf("%s", new_item->pItem.name);
printf("请输入住址:>");
//scanf("%s", p->data.address);
scanf("%s", new_item->pItem.address);
printf("请输入电话:>");
//scanf_s("%s", p->data.telephone_num,12);
scanf("%s", new_item->pItem.telephone_num, 12);
printf("请输入邮编:>");
//scanf("%d", &p->data.Postal);
scanf("%d", new_item->pItem.Postal);
printf("请输入E-mail:>");
//scanf("%s", p->data.E_mail);
scanf("%s", new_item->pItem.E_mail);
//p->size++;
link_header->count++;
struct link *temp = link_header;
while(temp->pNext!=0)
temp=temp->pNext;
temp->pNext = new_item;
printf("添加成功\n");
}
}
//**************删除联系人信息**************//
void Del(struct link *link_header, struct Contact* p)
{
char name;
int temp = 0;//用来确认是否删除
int flag = 0;
if (link_header->count <= 0){
//if (p->size <= 0) {
printf("通讯录中没有联系人,请添加!\n");
}
else
{
printf("查找姓名:");
scanf("%s", name);
struct link *temp = link_header;
struct link *pre_item = NULL;
if_found = 0;
for(;temp->pNext!=0;temp=temp->pNext)
{
if (strcmp(temp->pItem->name, name) == 0)
{
if_found = 1;
break;
}
pre_item = temp;
}
if (if_found)
{
pre_item->pNext = temp->pNext;
delete temp;
link_header->count--;
printf("删除成功!\n");
}
else
{printf("联系人不存在!\n");}
/*
flag = FindValue_1(p, name);
if (flag == -1)
{
printf("联系人不存在!\n");
}
else
{
int i = 0;
for ( i = flag; i < p->size - 1; i++)
{
p->data = p->data;
}
p->size--;
printf("删除成功!\n");
}*/
}
}
//***************主函数*****************//
int main()
{
int input = 0;
struct link header;
struct Contact con; //创建通讯录,里面包含1000个元素的数和size
InitContact(&con); //初始化通讯录
LoadContact(&con);
do
{
menu();
printf("请选择:>\n别输入字母哟!");
scanf("%d", &input);
switch (input)
{
case 1: Add(&header, &con);
break;
case 2: Del(&header, &con);
break;
/*case 3: Search(&con);
break;
case 4: Moidfy(&con);
break;
case 5: Show(&con);
break;
case 6: Sort(&con);
break;*/
case 0: printf("退出通讯录\n");
break;
default: printf("选择错误\n");
break;
}
} while (input);
// SaveFILE(&con);
return 0;
} 帮顶,看不懂{:1_907:} 链表有数据域和指针域,赋值后就要指向下一个地址。你这是结构体的结构体
页:
[1]
2