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;
}