01 链表

链表的基本实现与应用,差不多可以了
学生通讯录管理系统

#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#define MAX 10

// 链表
typedef struct Node
{
    int id, telenum;
    char name[20];
    int length;
    struct Node *next;
} Node, *LinkList;

struct Node *head = NULL; // 头指针
struct Node *tail = NULL;

// ********************** 主界面 ********************************
void mainInterface()
{
    printf("*************************欢迎使用通讯录系统******************************\n");
    printf("*                        1.通讯录的建立                                 *\n");
    printf("*                        2.插入通讯记录                                 *\n");
    printf("*                        3.查询通讯记录                                 *\n");
    printf("*                        4.删除通讯记录                                 *\n");
    printf("*                        5.显示通讯记录                                 *\n");
    printf("*                        0.退出管理系统                                 *\n");
    printf("*************************欢迎使用通讯录系统******************************\n");
}

// ********************** 1.通讯录的建立 ********************************
LinkList creatIncreLink(LinkList L)
{
    L = (Node *)malloc(sizeof(Node));      // 
    // head = *L; // 头指针指向头结点
    // tail = *L;
    L->length = 0;
    L->next = NULL;
    return L;
    //  L = new Node;
    // // L = (Node *)malloc(sizeof(Node));
    // head = L;
    // tail = L;
    // L->length = 0;
    // L->next = NULL;
    // return 0;

} // 就是初始化

// ********************** 2.插入通讯记录 ********************************
void insertYouXu(LinkList L) // 头插法创建单链表,创建完成后元素次序和输入时相反。引入尾插法
{
    int num, tele;
    char temp[20]; // 新插入的结点值
    printf("输入需要插入的元素值:学号,姓名,电话号码(输入id为9999结束插入)\n");
    scanf("%d%s%d", &num, temp, &tele);
    while (num != 9999) // 输入999时表示结束
    {
        LinkList s = (Node *)malloc(sizeof(Node)); // 创建新结点
        s->id = num;                               // 输入结点的值
        s->telenum = tele;
        // s->name=gets(temp);
        strcpy(s->name, temp);
        s->next = L->next;
        L->next = s;
        L->length++; // 单链表长度加一
        scanf("%d%s%d", &num, temp, &tele);
    }
    printf("插入成功\n");
}

// ********************** 3.查询通讯记录 ********************************
/*前面两个子函数必须在这个“父级”函数之前
不然要申明!一开始就是不知道这个,且不懂得什么是声明花了无意义的时间*/
//(1)按学号查询
int searchNum(LinkList L)
{
    printf("请输入要查找的学号id:\n");
    int id;
    LinkList p = L->next;
    scanf("%d", &id);
    while (p && p->id != id)
    {
        p = p->next;
    }
    if (p == NULL)
    {
        printf("你要查找的id号不存在!");
        return 0;
    }

    printf("%-15d%-15s%-15d", p->id, p->name, p->telenum);
    return 1;
}

// (2)按姓名查询
void searchName(LinkList L)
{
    printf("请输入要查找的名字:\n");
}

void search(LinkList L)
{
    printf("1.学号查询;2.姓名查询");
    int x;
    scanf("%d", &x);
    switch (x)
    {
    case 1:
        searchNum(L);
        break;
    case 2:
        searchName(L);
        break;
    default:
        break;
    }
}

// ********************** 4.删除通讯记录 ********************************
/*
按照学号删除  -> 出了问题后,自己想出来的解决方案,虽然没看过别人的方法,也不一定比别人的好,但还是好爽
之后看了别人的,确实别人的更好
*/
void delNum(LinkList L)
{
    printf("请输入要删除的学号id:\n");
    int id;
    scanf("%d", &id);
    LinkList p, q;
    p = L;
    while (p->next && p->next->id != id)
    {
        p = p->next;
    }
    if (p->next == NULL)
    {
        printf("需要删除的元素不存在!\n");
    }
    q = p->next;
    p->next = q->next;
    free(q);
    L->length--;
    printf("删除完成!\n");
    /*  这是一开始我的解决方法
        p = L->next; // 不能这么做,不然删除不了首元节点,想想其他办法
    if (p->id == x)
    {
        q = p;
        p = L; // 返回上一个节点
        p->next = q->next;
        free(q);
        L->length--;
        printf("删除完成\n");
    }
    else
    {
        while (p && p->id != x)
        {
            temp = p;
            p = p->next;
        }
        q = p; // 此时的q指向要被删除的p,q就是替罪羊
        p = temp;
        p->next = q->next;
        free(q);
        L->length--;
        printf("删除完成\n");
    }
    */
}
// 按照姓名删除
void delName(LinkList L)
{
    printf("请输入要删除的姓名:\n");

    /**
          p = L->next;
        if (!strcmp(p->name, a)) // 相等返回0,不相等返回1
        {
            q = p;
            p = L;
            p->next = q->next;
            free(q);
            L->length--;
            printf("删除完成\n");
        }
        else
        {
            while (p && strcmp(p->name, a))
            {
                temp = p;
                p = p->next;
            }
            q = p; // 此时的q指向要被删除的p,q就是替罪羊
            p = temp;
            p->next = q->next;
            free(q);
            L->length--;
            printf("删除完成\n");
        }
    */
}
void deleteList(LinkList L)
{
    printf("1.学号删除;2.姓名删除 : ");
    int x;
    scanf("%d", &x);
    switch (x)
    {
    case 1:
        delNum(L);
        break;
    case 2:
        delName(L);
        break;
    default:
        break;
    }
}

// ********************** 5.显示通讯记录 ********************************
void printList(LinkList L)
{
    printf("----------------------------------------------------------\n");
    printf("学号          姓名           电话号码\n");
    printf("----------------------------------------------------------\n");
    LinkList p = L->next;
    while (p)
    {
        printf("%-15d%-15s%-15d\n", p->id, p->name, p->telenum);
        p = p->next;
    }
}

// ********************** 0.退出管理系统 ********************************

// ********************** 主函数 ********************************
int main()
{
    LinkList L=NULL; // L是一个指针
    mainInterface();
    int option; // 进行选择
    do
    {
        printf("请选择你要进行的操作:\n");
        scanf("%d", &option);
        switch (option)
        {
        case 1:
            L=creatIncreLink(L);    // 对L
            printf("通讯录建立完成\n");
            break;
        case 2:
            insertYouXu(L);
            printf("插入通讯记录结束\n");
            break;
        case 3:
            printf("查询通讯记录\n");
            search(L);
            break;
        case 4:
            printf("删除通讯记录\n");
            deleteList(L);

            break;
        case 5:
            printf("显示通讯记录\n");
            printList(L);
            break;
        default:
            break;
        }

    } while (option != 0);
    printf("\n退出通讯录管理系统!");

    return 0;
}
posted @ 2023-10-03 22:40  被占用的小海海  阅读(4)  评论(0编辑  收藏  举报