单链表实现通讯录(增删查改)

前言

之前写了很多次通讯录,一次比一次复杂,从静态到动态,再到文件操作,再到顺序表,今天要好好复习一下单链表,于是乎干脆用单链表再写一遍。

首先我们之前已经用单链表写过他的增删查改了,于是乎,我们应该在此基础之上进行修改,而不是从头开始写,先把之前的增删查改拿出来

<<<<<<<<<——王子公主请看——>>>>>>>>>>>

SLT.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
#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);
}

好啦,之前写过详细的通讯录解析,所以这个就直接上答案了。

感谢观看!

单链表实现通讯录(增删查改)_第1张图片

你可能感兴趣的:(数据结构,数据库,数据结构,c语言,算法)