吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1152|回复: 10
收起左侧

[求助] 初学不懂,请问这样的算是使用了链表吗?

[复制链接]
djdgf4 发表于 2022-7-15 18:51
[C] 纯文本查看 复制代码
/*
以本班同学的具体数据为背景,设计一个本班同学通讯录
实现以下功能:
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[NAME_LEN];			//姓名
	char address[ADDRESS_LEN];		//地址
	char telephone_num[TEL_LEN];	//电话
	int Postal;						//邮编
	char E_mail[E_LEN];				//E-mail
};

//***************通讯录类型*****************//
struct Contact
{
	struct people data[MAX];	//存放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[p->size].name);
		printf("请输入住址:>");
		scanf("%s", p->data[p->size].address);
		printf("请输入电话:>");
		scanf_s("%s", p->data[p->size].telephone_num,12);
		printf("请输入邮编:>");
		scanf("%d", &p->data[p->size].Postal);
		printf("请输入E-mail:>");
		scanf("%s", p->data[p->size].E_mail);

		p->size++;
		printf("添加成功\n");
	}
}

//**************删除联系人信息**************//
void Del(struct Contact* p)
{
	char name[NAME_LEN];
	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[i] = p->data[i + 1];
				}
				p->size--;
				printf("删除成功!\n");
			
		}
	}
}

//**************修改联系人信息**************//
void Moidfy(struct Contact* p)
{
	float get = 0;
	char name[NAME_LEN];

	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[flag].name);
			printf("请输入住址:>");
			scanf("%s", p->data[flag].address);
			printf("请输入电话:>");
			scanf_s("%s", p->data[flag].telephone_num,12);
			printf("请输入邮编:>");
			scanf("%d", &p->data[flag].Postal);
			printf("请输入E-mail:>");
			scanf("%s", p->data[flag].E_mail);

			printf("修改成功!");
		}
	}
}

//**************查找联系人信息**************//
void Search(struct Contact* p)
{
	char name[NAME_LEN];
	char telephone_num[TEL_LEN];
	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[flag].name);
		printf("\t住址:>");
		printf("%s\n", p->data[flag].address);
		printf("\t电话:>");
		printf("%s\n", p->data[flag].telephone_num);
		printf("\t邮编:>");
		printf("%d\n", p->data[flag].Postal);
		printf("\tE-mail:>");
		printf("%s\n", p->data[flag].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
	{
		int  i, j;

		for (i = 0; i < p->size - 1; i++)
		{
			for (j = 0; j < p->size - i - 1; j++)
			{
				if (strcmp(p->data[j].name, (p->data[j + 1]).name) > 0)
				{
					struct people temp;
					temp = p->data[j];
					p->data[j] = p->data[j + 1];
					p->data[j + 1] = temp;
				}
			}
		}
		printf("排序成功!\n");
	
	}
}

//****************电话排序并显示****************//
void Sort_by_tele(struct Contact* p)
{

	if (p->size <= 0) {
		printf("通讯录中没有联系人,请添加!\n");
	}
	else
	{
		int  i, j;

		for (i = 0; i < p->size - 1; i++)
		{
			for (j = 0; j < p->size - i - 1; j++)
			{
				if (strcmp(p->data[j].telephone_num, (p->data[j + 1]).telephone_num) > 0)
				{
					struct people temp;
					temp = p->data[j];
					p->data[j] = p->data[j + 1];
					p->data[j + 1] = 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[i].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[i].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[i].name,
				p->data[i].address,
				p->data[i].telephone_num,
				p->data[i].Postal,
				p->data[i].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[p->size] = 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[i]), 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:13
本帖最后由 侃遍天下无二人 于 2022-7-15 20:14 编辑

链表还有容量上限吗,明显不是呀
djxinqing 发表于 2022-7-15 21:58
//***************通讯录类型*****************//
struct Contact
{
    struct people data[MAX];    //存放1000个信息
    int size;                   //记录当前结构体内已经有的元素个数
};

这不是数据结构静态数组么,而且还是个顺序表。。



djxinqing 发表于 2022-7-15 22:06
单链表:

struct Contact
{
    ElemType data;                        //你的people数据域
    struct Contact *next                 //指针域,指向下一个数据结点

}Contact;
dbgcode 发表于 2022-7-16 00:11
看起来就是一个结构体的数组而已,不像链表,一个链表至少要有表头表尾构成,而插入是根据表头表尾来了(俗成头插法和尾插法)。当然也有试验型的静态链表(只为概念而生,方便理解,实际程序不会用)。每次插入后都会移动节点的指针指向下一个节点,有点小复杂,建议画图理解。
tfrist 发表于 2022-7-16 00:24
这不算链表 而是数组!
blawhickte 发表于 2022-7-16 00:40
线性表吧
tfrist 发表于 2022-7-16 00:56
本帖最后由 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[NAME_LEN];            //姓名
    char address[ADDRESS_LEN];      //地址
    char telephone_num[TEL_LEN];    //电话
    int Postal;                     //邮编
    char E_mail[E_LEN];             //E-mail
};

//***************通讯录类型*****************//
struct Contact
{
    //struct people data[MAX];    //存放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[p->size].name);
        scanf("%s", new_item->pItem.name);
        printf("请输入住址:>");
        //scanf("%s", p->data[p->size].address);
        scanf("%s", new_item->pItem.address);
        printf("请输入电话:>");
        //scanf_s("%s", p->data[p->size].telephone_num,12);
        scanf("%s", new_item->pItem.telephone_num, 12);
        printf("请输入邮编:>");
        //scanf("%d", &p->data[p->size].Postal);
        scanf("%d", new_item->pItem.Postal);
        printf("请输入E-mail:>");
        //scanf("%s", p->data[p->size].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[NAME_LEN];
    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[i + 1];
                }               
                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;
}
我缘以为 发表于 2022-7-16 07:34
帮顶,看不懂
破竹而入 发表于 2022-7-16 07:51
链表有数据域和指针域,赋值后就要指向下一个地址。你这是结构体的结构体
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表