C语言实现通讯录管理系统:单链表详解

本文将使用 C 语言实现一个简单的通讯录管理系统,利用单链表来存储数据。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 50

typedef struct {
    char num[5];      // 编号
    char name[10];    // 姓名
    char sex[7];      // 性别
    char phone[15];   // 电话
    char addr[30];    // 地址
} Datatype;

typedef struct node{
    Datatype data;
    struct node *next;
} Tx_Linklist;

Tx_Linklist *L;

/* 创建带头结点的单链表L */
Tx_Linklist* SqLset(Tx_Linklist* L) {
    L = (Tx_Linklist*)malloc(sizeof(Tx_Linklist));
    L->next = NULL;
    return L;
}

/* 带头结点的单链表L的插入操作 -采用尾插法 */
void insert(Tx_Linklist* L) {
    Tx_Linklist *p = L;
    while (p->next != NULL) {
        p = p->next;
    }
    Tx_Linklist *newNode = (Tx_Linklist*)malloc(sizeof(Tx_Linklist));
    printf('请输入要插入的通讯者的编号:');
    scanf('%s', newNode->data.num);
    printf('请输入要插入的通讯者的姓名:');
    scanf('%s', newNode->data.name);
    printf('请输入要插入的通讯者的性别:');
    scanf('%s', newNode->data.sex);
    printf('请输入要插入的通讯者的电话:');
    scanf('%s', newNode->data.phone);
    printf('请输入要插入的通讯者的地址:');
    scanf('%s', newNode->data.addr);
    newNode->next = NULL;
    p->next = newNode;
}

/* 带头结点的单链表L的删除操作,输入编号,查找后删除,并返回该数据的序号 */
int delete(Tx_Linklist* L) {
    if (L->next == NULL) {
        printf('通讯录为空,无法删除。\n');
        return 0;
    }
    char num[5];
    printf('请输入要删除的通讯者的编号:');
    scanf('%s', num);
    Tx_Linklist *p = L->next;
    Tx_Linklist *pre = L;
    int idx = 0;
    while (p != NULL) {
        if (strcmp(p->data.num, num) == 0) {
            pre->next = p->next;
            free(p);
            return idx;
        }
        pre = p;
        p = p->next;
        idx++;
    }
    printf('未找到该编号的通讯者。\n');
    return -1;
}

/* 带头结点的单链表L的查询,输入编号,查找后打印,并返回该数据的序号在表中的序号 */
int query(Tx_Linklist* L) {
    if (L->next == NULL) {
        printf('通讯录为空,无法查询。\n');
        return 0;
    }
    char num[5];
    printf('请输入要查询的通讯者的编号:');
    scanf('%s', num);
    Tx_Linklist *p = L->next;
    int idx = 0;
    while (p != NULL) {
        if (strcmp(p->data.num, num) == 0) {
            printf('编号:%s\n', p->data.num);
            printf('姓名:%s\n', p->data.name);
            printf('性别:%s\n', p->data.sex);
            printf('电话:%s\n', p->data.phone);
            printf('地址:%s\n', p->data.addr);
            return idx;
        }
        p = p->next;
        idx++;
    }
    printf('未找到该编号的通讯者。\n');
    return -1;
}

/* 带头结点的单链表L的打印 */
void printData(Tx_Linklist* L) {
    if (L->next == NULL) {
        printf('通讯录为空,无法输出。\n');
        return;
    }
    Tx_Linklist *p = L->next;
    printf('编号\t姓名\t性别\t电话\t地址\n');
    while (p != NULL) {
        printf('%s\t%s\t%s\t%s\t%s\n', p->data.num, p->data.name, p->data.sex, p->data.phone, p->data.addr);
        p = p->next;
    }
}

/*菜单选择函数*/
int  menu_select( ) {
    int  sn;    
    for(  ;  ; ){  
        scanf( '%d', &sn);
           if( sn<0 || sn>5 )
             printf('\n输入错误,重选0-5:\n');
        else
            break;
    }
    return  sn;
  }
  
/*主控菜单处理函数(主函数)*/
void  main(  ){
    printf('通讯录管理系统\n');
    printf('==================\n');
    printf('1 通讯录表的建立\n');
    printf('2 通讯者的插入\n');
    printf('3 通讯者的删除\n');
    printf('4 通讯者的查询\n');
    printf('5 通讯录表的输出\n');
    printf('0 退出管理系统\n');
    printf('==================\n');
    for(  ;  ; ){
        switch( menu_select( ) ){  
            case  1:  printf('通讯录表的建立\n');
                      L = SqLset(L);
                      break;
            case  2:  printf('通讯者的插入\n');
                      insert(L);
                      break;
            case  3:  printf('通讯者的删除\n');
                      printf('%d\n',delete(L));
                      break;
            case  4:  printf('通讯者的查询\n');
                      printf('%d\n',query(L));                        
                      break;
            case  5:  printf('通讯录表的输出\n');
                      printData(L);
                      break;
            case  0:  printf('再见\n');
                      exit(0);
        }
    }
}

代码说明

  1. 数据结构定义: 使用 Datatype 结构体表示单个通讯录成员信息,使用 Tx_Linklist 结构体表示链表节点,节点中包含 Datatype 数据和指向下一个节点的指针。
  2. 函数实现: 实现了创建链表 SqLset,插入节点 insert,删除节点 delete,查询节点 query 和打印链表 printData 等功能函数。
  3. 主函数: main 函数中实现了菜单选择和调用相应功能函数的逻辑。

总结

本文使用 C 语言和单链表实现了一个简单的通讯录管理系统,演示了如何使用单链表进行数据存储、插入、删除、查询等操作。

C语言实现通讯录管理系统:单链表详解

原文地址: https://www.cveoy.top/t/topic/Sfm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录