首页 > 其他分享 >01 链表

01 链表

时间:2023-10-03 23:04:57浏览次数:36  
标签:Node LinkList 01 next 链表 printf break id

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

#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;
}

标签:Node,LinkList,01,next,链表,printf,break,id
From: https://www.cnblogs.com/zhanjianhai/p/17741770.html

相关文章

  • [GXYCTF2019]Ping Ping Ping 1
    原理RCE命令执行的多种绕过姿势解题过程进入靶场提示要传递参数ip那就传递一下127.0.0.1,结果正常试试进行拼接,试了127.0.0.1&&ls或者127.0.0.1&ls都不行,,,直到用;做连接符才可以payload:127.0.0.1;ls发现有index.php和flag.php文件,猜测flag应该在flag.php内接着尝试读取......
  • 题目:2019年5月发布的四川旅游国际形象
    问题:2019年5月发布的四川旅游国际形象新标识中的动物元素是()。A.小熊猫B.大熊猫C.金丝猴参考答案如下,发送题目到公众号学哈,自动回复答案解析:四川旅游国际形象新标识于2019年5月发布,其中的动物元素是大熊猫(选项B)。大熊猫是四川的特有物种,也是中国的国宝之一,因此在四川旅游形象标识中......
  • 2017 China Collegiate Programming Contest Final (CCPC-Final 2017)
    Preface今天打学校统一要求的这场CCPC2017Final,直接被打爆了,各种数学题搞得人生活不能自理主要是H徐神开场就秒出了正确的思路,然后一心认准高斯消元然后一直想+写+调到结束都没卡过去比赛最后20min的时候祁神想到了更好写的基于施密特正交化的方法,可以碍于时间有限没调出来不......
  • APIO2019 桥梁
    Day\(\mathbb{Z}(\text{Ni})\)。想成kruskal重构树后就再也不会了。考虑没有修改怎么做,将所有边和询问按照权值从大到小排序,对于一个询问\((s,w)\),向并查集中插入所有边权\(\gew\)的边,维护连通块大小即可。现在有了修改,考虑对询问修改分块。设每\(B\)个询问修改重构一......
  • Codeforces Round 901 (Div. 2)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1875。爱丽数码我真的好喜欢你啊为了你我要定制你的帆布包口牙!!!!A显然只会在剩余时间为1时使用工具,模拟即可。///*By:Luckyblock*/#include<bits/stdc++.h>#defineLLlonglong//========......
  • [网鼎杯 2018]Fakebook
    这是一道SQL联合注入与ssrf的题目解题过程进入链接发现是一个注册登录界面。在登录页面尝试注入没有作用。先随便注册一个用户登录后点击用户名跳转到详情界面随手测试发现存在报错,大概率有SQL注入1and1=2无回显测试为数字型注入尝试union联合注入,1orderby4查询......
  • ImageNet数据集(ILSVRC2012)分析
    ImageNet数据集(ILSVRC2012)获取方法:首先,需要有一个edu的邮箱,因为该数据集只提供给高校科研工作者。然后,使用edu邮箱注册一个账号,获得的邮件通知,需要验证以后登录,进入下载链接即可下载。官网下载链接:https://image-net.org/download-images.php本次下载内容:ImageNetLarge-scaleV......
  • BUUOJ[极客大挑战 2019]Havefun 1
    原理url参数的传递页面原代码的查看解题过程进入靶场没看到什么有用的东西,那就得看页面源代码了,一般都有提示果然,让我们传递值为dog的cat参数,试一下payload:?cat=dog爆出flag......
  • 题解 [蓝桥杯 2016 省 B] 交换瓶子
    题目链接本题解讲解环图的做法。要将一个\(1\simn\)的排列通过交换变成\(1\simn\),可以先将\(i\)向\(a_i\)连边,那么最终一定会练成若干个环(每个点只有一个出度,也只有一个入度)。假设交换在同一个环中的节点,一个环显然会变成两个环,也就是说,交换一次最多增加一个环的数量,......
  • 【题解】洛谷 P1003 [NOIP2011 提高组] 铺地毯
    原题链接解题思路如果直接按照题意开一个二维数组来模拟每个点最上面的地毯编号,会发现所占空间最坏情况下约为(2*105)2*4B=4*1010*4B=1.6*1011B≈149GB,程序完全无法运行。但实际上没有必要将每一个点的信息记录下来,只需要记录每一块地毯能覆盖哪些点,再依次判断哪那些地毯可以......