前言
之前写了很多次通讯录,一次比一次复杂,从静态到动态,再到文件操作,再到顺序表,今天要好好复习一下单链表,于是乎干脆用单链表再写一遍。
首先我们之前已经用单链表写过他的增删查改了,于是乎,我们应该在此基础之上进行修改,而不是从头开始写,先把之前的增删查改拿出来
<<<<<<<<<——王子公主请看——>>>>>>>>>>>
SLT.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"contact.h"
typedef PeoInfo SLTDataType;
typedef struct SListNode
{
SLTDataType val;
struct SListNode* next;
}SLTNode;//打印数据内容
//void SLTPrint(SLTNode* phead);
//创建对应类型变量
SLTNode* creat(SLTDataType x);
//头部插入删除/尾部插入删除
void SLTPushBack(SLTNode** pphead, SLTDataType x);
void SLTPushFront(SLTNode** pphead, SLTDataType x);
void SLTPopBack(SLTNode** pphead);
void SLTPopFront(SLTNode** pphead);查找
//SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
//在指定位置之前插入数据
void SLTInsertFront(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos);
//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos);
//销毁链表
void SLTDesTroy(SLTNode** pphead);
SLT.c
#include"SLT.h"
//SLTNode* creat(SLTDataType x)
//{
// SLTNode* p = malloc(sizeof(SLTNode));
// p->val = x;
// p->next = NULL;
// return p;
//}
SLTNode* creat(SLTDataType x)
{
SLTNode* p = malloc(sizeof(SLTNode));
p->val = x;
p->next = NULL;
return p;
}
//void SLTPrint(SLTNode* phead)
//{
// while (phead)
// {
// printf("%d ", phead->val);
// phead = phead->next;
// }
// puts("");
//}//尾部插入
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{
assert(pphead);
if (*pphead == NULL)
*pphead = creat(x);
else
{
while ((*pphead)->next)
{
*pphead = (*pphead)->next;
}
(*pphead)->next = creat(x);
}
}
//头部插入
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
assert(pphead);
if (*pphead == NULL)
if (*pphead == NULL)
*pphead = creat(x);
else
{
SLTNode* new = (*pphead);
*pphead = creat(x);
(*pphead)->next = new;
}
}
//尾部删除
void SLTPopBack(SLTNode** pphead)
{
assert(pphead);
assert(*pphead);
if (((*pphead)->next) == NULL)
*pphead= NULL;
else
{
while ((*pphead)->next->next)
{
(*pphead) = (*pphead)->next;
}
free((*pphead)->next);
(*pphead)->next = NULL;
}
}
//头部删除
void SLTPopFront(SLTNode** pphead)
{
assert(pphead);
assert(*pphead);
SLTNode* new = (*pphead)->next;
free(*pphead);
*pphead = new;
}
//查找
//SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
//{
// while (phead&&phead->val != x)
// phead = phead->next;
// if (phead == NULL)
// {
// printf("你要找的内容不存在\n");
// return 0;
// }
// return phead;
//}
//在指定位置之前插入数据
void SLTInsertFront(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
assert(pphead);
assert(*pphead);
assert(pos);
if ((*pphead) == pos)
{
*pphead = creat(x);
(*pphead)->next = pos;
}
else
{
while ((*pphead)->next != pos)
{
*pphead = (*pphead)->next;
}
SLTNode* new = (*pphead)->next;//不对劲!!!!!!
(*pphead)->next = creat(x);
(*pphead)->next->next = pos;
}
}
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
assert(pphead);
assert(*pphead);
if (*pphead == pos)
{
free(pos);
*pphead = NULL;
}
else
{
while ((*pphead)->next != pos)
*pphead = (*pphead)->next;
(*pphead)->next = (*pphead)->next->next;
free(pos);
pos = NULL;
}
}
//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
assert(pos);
SLTNode* new = pos->next;
pos->next = creat(x);
pos->next->next = new;
}
//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos)
{
assert(pos);
SLTNode* new = pos->next;
pos->next = pos->next->next;
free(new);
}//销毁链表
void SLTDesTroy(SLTNode** pphead)
{
assert(pphead);
while (*pphead != NULL)
{
SLTNode* p = (*pphead)->next;
free(*pphead);
*pphead = p;
}
}
contact.h
#pragma once
#define NAME_MAX 100
#define SEX_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
struct SListNode;
//前置声明
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;
typedef PeoInfo SLTDataType;
//创建对应数据类型
contact* creatt(void);
//初始化通讯录
void InitContact(contact** con);
//添加通讯录数据
void AddContact(contact** con);
//删除通讯录数据
void DelContact(contact** con);
//展示通讯录数据
void ShowContact(contact* con);
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact** con);
//销毁通讯录数据
void DestroyContact(contact** con);
contact.c
#include"SLT.h"
SLTNode* creatt(void)
{
SLTDataType a;
printf("输入名字\n");
gets(a.name);
printf("输入地址\n");
gets(a.addr);
printf("输入性别\n");
gets(a.sex);
printf("输入电话\n");
gets(a.tel);
printf("输入年龄\n");
scanf("%d", &a.age);
getchar();
SLTNode*p= creat(a);
return p;
};
//初始化通讯录
void InitContact(contact** con)
{
/* FILE*p=fopen("contact", "rb");*/
*con = (contact*)malloc(sizeof(contact));
/* contact* new = con;
if (p != NULL)
do
{
contact* ps = (contact*)(sizeof(contact));
if (fread(ps, sizeof(contact), 1, p))
new->next = ps;
}*/
}
//添加通讯录数据
void AddContact(contact** con)
{
*con = creatt();
}
//删除通讯录数据
void DelContact(contact** con)
{
SLTPopBack(con);
}
//展示通讯录数据
void ShowContact(contact* con)
{
printf("姓名\t地址\t性别\t电话\t年龄\n");
while (con)
{
printf("%s \t", con->val.name);
printf("%s \t", con->val.addr);
printf("%s \t", con->val.sex);
printf("%s \t", con->val.tel);
printf("%d ", con->val.age);
puts("");
con = con->next;
}
}
//查找通讯录数据
void FindContact(contact* con)
{
printf("输入你要找的人名\n");
char arr[20];
gets(arr);
if (con == NULL)
printf("通讯录空了\n");
else
{
while (con&&strcmp(con->val.name, arr))
{
con = con->next;
}
if (con != NULL)
{
printf("姓名\t地址\t性别\t电话\t年龄\n");
printf("%s \t", con->val.name);
printf("%s \t", con->val.addr);
printf("%s \t", con->val.sex);
printf("%s \t", con->val.tel);
printf("%d ", con->val.age);
puts("");
}
else
printf("没找到\n");
}
}
//修改通讯录数据
void ModifyContact(contact** con)
{
printf("输入你修改的人名\n");
char arr[20];
gets(arr);
if (*con == NULL)
printf("通讯录空了\n");
else
{
while (*con&&strcmp((*con)->val.name, arr))
{
*con = (*con)->next;
}
if (*con == NULL)
printf("没找到这个人\n");
else
{
(*con) = creatt();
printf("修改成功\n");
}}
}
//销毁通讯录数据
void DestroyContact(contact** con)
{
SLTDesTroy(con);
}
main函数
#include"SLT.h"
int main()
{
contact* p=NULL;
InitContact(&p);
AddContact(&p);
//删除通讯录数据
//DelContact(&p);
//展示通讯录数据
ShowContact(p);
//查找通讯录数据
FindContact(p);
//修改通讯录数据
ModifyContact(&p);
//销毁通讯录数据
DestroyContact(&p);
}
好啦,之前写过详细的通讯录解析,所以这个就直接上答案了。
感谢观看!