不过多赘述了
顺序表的增删查改-CSDN博客https://blog.csdn.net/bkmoo/article/details/137566495?spm=1001.2014.3001.5502
使用顺序表实现通讯录-CSDN博客https://blog.csdn.net/bkmoo/article/details/137676561?spm=1001.2014.3001.5502这里没有使用文件操作只是简单的使用单链表创造一次性的单链表,主要体现是单链表的使用。
首先创建头文件,用来放置函数的声明。contact.h文件,函数的功能分别是创建节点(初始化),通讯录的增删查改和展示通讯录,销毁通讯录。
contact.h代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma once
#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;
struct SListNode
{
PeoInfo* pival;
contact* next;
};
//创建节点//初始化通讯录
contact* newNode();
//添加通讯录数据
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文件放置函数功能实现的代码
创建节点,包含对节点初始化contact* newNode()
contact* newNode()
{
contact* Node = (contact*)malloc(sizeof(contact));
Node->pival = (PeoInfo*)malloc(sizeof(PeoInfo));
Node->next = NULL;
return Node;
}
要记住使用结构体指针储存数据时要分配内存空间,否则就会报错
增加联系人void AddContact(contact* con)
//添加
void AddContact(contact* con)
{
//PeoInfo arr;
contact* pcur = con;
contact* newnode = newNode();
contactadd(newnode);
while (pcur->next != NULL)
{
pcur = pcur->next;
}
pcur->next = newnode; // 在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址
//因此要先解引用后链接(->相当于一层解引用)
}
先创建节点初始化,输入数据后。得到一个完整的节点后进行操作,不然就很乱,这样更容易操作。
在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址,因此要先解引用后链接(->相当于一层解引用)
这里使用到的contactadd函数是输入联系人内容的操作contactadd
void contactadd(contact* con)
{
//PeoInfo* ret = (PeoInfo*)malloc(sizeof(PeoInfo));
printf("请输入联系人姓名:\n");
scanf("%s", con->pival->name);
printf("请输入联系人性别:\n");
scanf("%s", con->pival->sex);
printf("请输入联系人年龄:\n");
scanf("%d", &(con->pival->age));
printf("请输入联系人电话\n");
scanf("%s", con->pival->tel);
printf("请输入联系人地址:\n");
scanf("%s", con->pival->addr);
}
查找操作void FindContact(contact* con)
实现查找操作要先创建一个函数用来寻找节点,方便后续的删除修改操作。一般查找联系人是以人名来找,因此还要一个name数组。
查找节点的函数contact* findContact(contact* con, char a[])
contact* findContact(contact* con, char a[])
{
con = con->next;
while (con != NULL)
{
if (strcmp(con->pival->name, a) == 0)
{
return con;
}
con = con->next;
}
return NULL;
}
//查找void FindContact(contact* con)
{
printf("请输入要查找的联系人名字:\n");
char a[NAME_MAX];
scanf("%s", a);
contact* ret = findContact(con, a);
if (ret)
{
printf("找到了\n");
}
else
{
printf("没找到\n");
}
}
删除联系人
删除操作需要先找到要删除的联系人使用contact* findContact(contact* con, char a[])函数
//删除
void DelContact(contact* con)
{
contact* pcur = con;
printf("请输入要删除的联系人名字:\n");
char a[NAME_MAX];
scanf("%s", a);
contact* ret = findContact(con, a);
if (ret)
{
while (pcur->next != ret)
{
pcur = pcur->next;
}
pcur->next = ret->next;
free(ret);
ret = NULL;
}
else
{
printf("查无此人\n");
}
}
修改联系人数据void ModifyContact(contact** con)
需要先找到需要修改的联系人
//修改
void ModifyContact(contact** con)
{
contact* pcur = con;
printf("请输入要修改的联系人名字:\n");
char a[NAME_MAX];
scanf("%s", a);
contact* ret = findContact(con, a);
if (ret)
{
contactadd(ret);
}
else
{
printf("查无此人\n");
}
}
展示操作void ShowContact(contact* con)
//展示
void ShowContact(contact* con)
{
con = con->next;
while (con != NULL)
{
printf("姓名:%s ", con->pival->name);
printf("性别:%s", con->pival->sex);
printf("年龄:%d", con->pival->age);
printf("电话:%s", con->pival->tel);
printf("地址:%s", con->pival->addr);
printf("\n");
con = con->next;
}
}
最后销毁链表
//销毁
void DestroyContact(contact** con)
{
contact* pcur = *con;
contact* perv = pcur->next;
while (pcur)
{
free(pcur->pival);
free(pcur);
pcur = perv;
if (pcur == NULL)
{
break;
}
perv = perv->next;
}
}
contact.c代码
#include "contact.h"
void prin(contact* con)
{
con = con->next;
while (con != NULL)
{
printf("姓名:%s ", con->pival->name);
printf("性别:%s", con->pival->sex);
printf("年龄:%d", con->pival->age);
printf("电话:%s", con->pival->tel);
printf("地址:%s", con->pival->addr);
printf("\n");
con = con->next;
}
}
contact* newNode()
{
contact* Node = (contact*)malloc(sizeof(contact));
Node->pival = (PeoInfo*)malloc(sizeof(PeoInfo));
Node->next = NULL;
return Node;
}
//联系人数据
void contactadd(contact* con)
{
//PeoInfo* ret = (PeoInfo*)malloc(sizeof(PeoInfo));
printf("请输入联系人姓名:\n");
scanf("%s", con->pival->name);
printf("请输入联系人性别:\n");
scanf("%s", con->pival->sex);
printf("请输入联系人年龄:\n");
scanf("%d", &(con->pival->age));
printf("请输入联系人电话\n");
scanf("%s", con->pival->tel);
printf("请输入联系人地址:\n");
scanf("%s", con->pival->addr);
}
//添加
void AddContact(contact* con)
{
//PeoInfo arr;
contact* pcur = con;
contact* newnode = newNode();
contactadd(newnode);//先创建,初始化,输入数据后。即一个完整的节点后进行操作,不然就很乱
while (pcur->next != NULL)
{
pcur = pcur->next;
}
pcur->next = newnode; // 在连接时不要用pcur直接等于这里的pcur是临时值,临时值中保存的内容才是需要操作的地址
//因此要先解引用后链接(->相当于一层解引用)
}
contact* findContact(contact* con, char a[])
{
con = con->next;
while (con != NULL)
{
if (strcmp(con->pival->name, a) == 0)
{
return con;
}
con = con->next;
}
return NULL;
}
//查找
void FindContact(contact* con)
{
printf("请输入要查找的联系人名字:\n");
char a[NAME_MAX];
scanf("%s", a);
contact* ret = findContact(con, a);
if (ret)
{
printf("找到了\n");
}
else
{
printf("没找到\n");
}
}
//删除
void DelContact(contact* con)
{
contact* pcur = con;
printf("请输入要删除的联系人名字:\n");
char a[NAME_MAX];
scanf("%s", a);
contact* ret = findContact(con, a);
if (ret)
{
while (pcur->next != ret)
{
pcur = pcur->next;
}
pcur->next = ret->next;
free(ret);
ret = NULL;
}
else
{
printf("查无此人\n");
}
}
//修改
void ModifyContact(contact** con)
{
contact* pcur = con;
printf("请输入要修改的联系人名字:\n");
char a[NAME_MAX];
scanf("%s", a);
contact* ret = findContact(con, a);
if (ret)
{
contactadd(ret);
}
else
{
printf("查无此人\n");
}
}
//展示
void ShowContact(contact* con)
{
con = con->next;
while (con != NULL)
{
printf("姓名:%s ", con->pival->name);
printf("性别:%s", con->pival->sex);
printf("年龄:%d", con->pival->age);
printf("电话:%s", con->pival->tel);
printf("地址:%s", con->pival->addr);
printf("\n");
con = con->next;
}
}
//销毁
void DestroyContact(contact** con)
{
contact* pcur = *con;
contact* perv = pcur->next;
while (pcur)
{
free(pcur->pival);
free(pcur);
pcur = perv;
if (pcur == NULL)
{
break;
}
perv = perv->next;
}
}