链表-->增-->删-->查-->改-->排序

本文介绍了一个使用C语言实现的链表管理系统,包括节点的增删改查及排序等功能。通过随机生成学号来演示如何创建节点,并提供了用户交互界面进行各种操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>

typedef struct num
{
    int ID;
    struct num *next;
}  SS;
SS *head = NULL;


int count = 0;
void add_node();
void remove_node(int id);
void seek_node();
void revise_node(SS *p);
void print_list();
void sort_list();
void turnoff();

//增加节点
void add_node()
{
    SS *temp, *p = (SS*)malloc(sizeof(SS));
    p->ID = rand() % 100 + 20;
    if (head != NULL)
    {
        temp = head;
        head = p;
        p->next = temp;
    }
    else{
        head = p;
        p->next = NULL;
    }
    count++;
    print_list();
}

//删除节点
void remove_node(int id)
{
    SS *p, *p1;
    if (!count)
    {
        printf("\n当前人数为0,无法进行删除,修改等操作!");
        return;
    }
    if (head->ID == id)
    {
        p = head;
        head = head->next;
        free(p);
    }
    else
    {
        p = head;
        while (head != NULL)
        {
            if (head->next->ID == id)
            {
                p1 = head->next->next;
                free(head->next);
                head->next = p1;
                break;
            }
            head = head->next;
        }
        head = p;
    }
    count--;
    print_list();
}


//查找节点
void seek_node()
{
    int i,choose;
    SS *p = head;
    printf("请输入您要查找的学号:");
    scanf("%d", &i);
    getchar();
    while (p != NULL)
    {
        if (p->ID == i)
        {
            printf("找到----%d-------", p->ID);
            printf("\n1,修改 2,删除\n");
            scanf("%d", &choose);
            getchar();
            (choose - 1) ? remove_node(i) : revise_node(p);
            return;
        }
        p = p->next;
    }
    p ? 0 : printf("\n找不到");
}


//修改节点
void  revise_node(SS *p)
{
    printf("\n请修改学号:");
    scanf("%d", &p->ID);
    print_list();
}


//打印链表
void print_list()
{
    SS *p = head;
    printf("\nhead -> ");
    while (p != NULL)
    {
        printf("%d -> ", p->ID);
        p = p->next;
    }
    printf("NULL\n");
}

//链表排序
void sort_list()
{
    SS *p1, *p2, *temp, *start, *p = head;
    temp = (SS*)malloc(sizeof(SS));
    while (head != NULL)
    {
        start = head;
        while (start->next != NULL)
        {
            if (head->ID > start->next->ID)
            {
                p1 = head->next;
                p2 = start->next->next;

                *temp = *(start->next);
                *(start->next) = *head;
                *head = *temp;

                head->next = p1;
                start->next->next = p2;
            }
            start = start->next;
        }
        head = head->next;
    }
    head = p;
    free(temp);
    print_list();
}


//主函数
void main()
{
    int i,choose;
    char choose1;
    for (i = 0; i < 5; i++)
    {
        add_node();
    }
    print_list();

MENU:
    printf("\n1,增  2,查   3,排序  4,显示全部  5,退出\n");
    scanf("%d", &choose);
    getchar();
    if (count == 0)
    {
        printf("\n当前系统人数为0,是否先添加? Y/N\n");
        scanf("%c", &choose1);
        getchar();
        if (choose1 == 'Y' || choose1 == 'y')
        {
            choose = 1;
        }
        else
        {
            goto MENU;
        }
    }
    switch (choose)
    {
    case 1:
        add_node();
        break;
    case 2:
        seek_node();
        break;
    case 3:
        sort_list();
        break;
    case 4:
        print_list();
        break;
    case 5:
        turnoff();
        return;
    default:
        printf("\n输入有误!!\n");
    }
    goto MENU;
    getchar();
}

void turnoff()
{
    SS *p = head;
    while (head != NULL)
    {
        p = head;
        head = head->next;
        free(p);
    }
    system("color 5e");
    printf("\n系统将于3秒后自动退出\n");
    Sleep(3000);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值