单链表实现通讯录

2024-04-30 21:21:42 浏览数 (2)

SL.h 单链表基文件

代码语言:javascript复制
#pragma once

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
typedef struct PersonInfo* SLTDataType;

typedef struct SListNode
{
	SLTDataType Mumber;
	struct SListNode* next;
}SLTNode;

void SLTPrint(SLTNode* phead);

void SLInit(SLTNode** pphead);

//void SLTPushBack(SLTNode** pphead, SLTDataType x); //用不到

void SLTPushFront(SLTNode** pphead, SLTDataType x);

//void SLTPopBack(SLTNode** pphead); //用不到 不代表我不会写

void SLTPopFront(SLTNode** pphead);

SLTNode* SLTFind(SLTNode* phead);

//void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x); //用不到

//void SLTInsertAfter(SLTNode* pos, SLTDataType x); //用不到

void SLTErase(SLTNode** pphead, SLTNode* pos);

//void SLTEraseAfter(SLTNode** pphead); //用不到

void SListDesTroy(SLTNode** pphead);

 SL.c文件

代码语言:javascript复制
#define _CRT_SECURE_NO_WARNINGS
#include"Mumber.h"

//typedef struct PersonInfo
//{
//    char name[NAME_MAX];
//    char sex[SEX_MAX];
//    int age;
//    char tel[TEL_MAX];
//    char addr[ADDR_MAX];
//}PeoInfo;

void SLTPrint(SLTNode* phead)
{
	assert(phead);
	printf("名字:%s 性别:%s 年龄:%d 电话:%s 住址:%sn", phead->Mumber->name, phead->Mumber->sex, phead->Mumber->age, phead->Mumber->tel, phead->Mumber->addr);
}

void SLInit(SLTNode** pphead)
{
	SLTNode* new = (SLTNode*)malloc(sizeof(SLTNode));
	if (new == NULL)
	{
		perror("malloc fail!");
		exit(1);
	}
	*pphead = new;
	(*pphead)->next = NULL;
	(*pphead)->Mumber = NULL;
}

void SListDesTroy(SLTNode** pphead)
{
	assert(pphead&&*pphead);
	SLTNode* prve = *pphead;
	while (prve)
	{
		SLTNode* next = prve->next;
		free(prve);
		prve = next;
	}
	*pphead = NULL;
}

SLTNode* SLTBuyNode(SLTDataType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		perror("malloc fail!");
		exit(1);
	}
	newnode->Mumber = x;
	newnode->next = NULL;
	return newnode;
}

void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = (*pphead)->next;
	(*pphead)->next = newnode;
}

void SLTPopFront(SLTNode** pphead)
{
	assert(pphead && *pphead && (*pphead)->next);
	SLTNode* del = (*pphead)->next;
	(*pphead)->next = (*pphead)->next->next;
	free(del);
}

SLTNode* SLTFind(SLTNode* phead)//特供版
{
	assert(phead && phead->next);
	printf("请输入要查找的名字:");
	char name[NAME_MAX] = { 0 };
	scanf("%s", &name);
	phead = phead->next;
	while (phead)
	{
		if (strcmp(phead->Mumber->name, name) == 0)
			return phead;
		phead = phead->next;
	}
	printf("我找不到,你确定你给我了?");
	return NULL;
}

 通讯录头文件

代码语言:javascript复制
#pragma once
#include"SL.h"
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100

//前置声明
typedef struct SListNode contact;

//用户数据
typedef struct PersonInfo
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char tel[TEL_MAX];
    char addr[ADDR_MAX];
}PeoInfo;

//初始化通讯录
void InitContact(contact** con);//ok
//添加通讯录数据
void AddContact(contact** con);//这里只给头插了 ok
//删除通讯录数据
void DelContact(contact** con);//头删除 他没让我写指定位置删除 ok
//展示通讯录数据
void ShowContact(contact* con);//ok
//查找通讯录数据
void FindContact(contact* con);//ok
//修改通讯录数据
void ModifyContact(contact** con);//只是修改 没说删
//销毁通讯录数据
void DestroyContact(contact** con);//销毁 ok

通讯录c文件

代码语言:javascript复制
#define _CRT_SECURE_NO_WARNINGS
#include"Mumber.h"

void InitContact(contact** con)
{
	SLInit(con);
}
void DestroyContact(contact** con)
{
	SListDesTroy(con);
}
void ContExchange(SLTDataType *x)//这里写窄了 没办法用于修改内容
{
	PeoInfo* mumber = (PeoInfo*)malloc(sizeof(PeoInfo));
	if(mumber == NULL)
	{
		perror("malloc fail!");
		exit(1);
	}
	*x = mumber;
	printf("名字: 性别: 年龄: 电话: 住址:n");
	scanf("%s %s %d %s %s", (*x)->name, (*x)->sex,&(*x)->age,(*x)->tel,(*x)->addr);
}
void AddContact(contact** con)
{
	PeoInfo* mumber = NULL;
	ContExchange(&mumber);
	SLTPushFront(con, mumber);
}
void ShowContact(contact* con)
{
	assert(con);
	do
	{
		con = con->next;
		SLTPrint(con);
	} while (con->next);
}
void DelContact(contact** con)
{
	assert(con && *con && (*con)->next);
	//先删除对应的内容 然后在链表内删除结点
	free((*con)->next->Mumber);
	(*con)->next->Mumber = NULL;
	SLTPopFront(con);
}
void FindContact(contact* con)
{
	assert(con&&con->next);
	contact* find = SLTFind(con);
	while (find == NULL)
	{
		find = SLTFind(con);
	}
	SLTPrint(find);
}
void ModifyContact(contact** con)
{
	assert(con && *con&&(*con)->next);
	contact* find = SLTFind(*con);
	while (find == NULL)
	{
		find = SLTFind(con);
	}
	SLTPrint(find);
	printf("名字: 性别: 年龄: 电话: 住址:n");
	scanf("%s %s %d %s %s", find->Mumber->name, find->Mumber->sex, &find->Mumber->age, find->Mumber->tel, find->Mumber->addr);
}

测试文件

代码语言:javascript复制
#define _CRT_SECURE_NO_WARNINGS
#include"Mumber.h"

//void test()
//{
//	contact* mumber;
//	//初始化
//	InitContact(&mumber);
//	//插入三个
//	AddContact(&mumber);
//	AddContact(&mumber);
//	AddContact(&mumber);
//	//头删除 //删除最近加入的
//	//DelContact(&mumber);
//	//查找
//	FindContact(mumber);
//	//修改
//	ModifyContact(&mumber);
//	//展示
//	ShowContact(mumber);
//	//摧毁
//	DestroyContact(&mumber);
//}

void meau()
{
	printf("***************************************n");
	printf("*1.插入通讯录         2.删除刚输入的人*n");
	printf("*3.展示通讯录         4.修改某个人数据*n");
	printf("*             0.推出通讯录            *n");
	printf("***************************************n");
}


void main()
{
	int n = 0;
	contact* mumber;
	InitContact(&mumber);
	do
	{	
		meau();
		scanf("%d", &n);
		switch (n)
		{
		case 1:   AddContact(&mumber); break;
		case 2:   DelContact(&mumber); break;
		case 3:   ShowContact(mumber); break;
		case 4:ModifyContact(&mumber); break;
		case 0:DestroyContact(&mumber); break;
		default: scanf("%d", &n);
		}
	} while (n);
	return 0;
}

0 人点赞