单链表的查询和删除纯代码直接运行的

博主复习数据结构时,实现了单链表的查询和删除功能,并做成菜单形式。代码包含初始化、头插法和尾插法建表、输出链表、按位置和值查找、删除结点等功能,后续还会添加其他数据结构内容。

最近复习数据结构的时候写的一个关于单链表的查询和删除并且做成菜单的形式后期还会有其他数据结构的内容。

#include<stdio.h>
#include<windows.h>
#include<malloc.h>
#define MAXSIZE 1024
typedef struct Node
{
    int num;
    struct Node *next;
}LinkNode,*Linklist;
/*
*************初始化空链表*************
*/
Linklist InitLinklist()
{
    Linklist L=(Linklist)malloc(sizeof(LinkNode));
    L->next = NULL;
    //L->next = NULL;
    return L;
}
/*
*************头插法建链表**************
*/
void CreatFormHead(Linklist L)
{
    int data;
    scanf_s("%d",&data);
    Linklist s;
    while (data != -1)
    {
        s = (Linklist)malloc(sizeof(LinkNode));
        s->num = data;
        s->next = L->next;
        L->next = s;
        scanf_s("%d",&data);
    }
    L->next = NULL;

}
/*
****************输出链表******************
*/
void PrintList(Linklist L)
{
    Linklist p;
    p = L->next;
    while (p)
    {
        printf("%2d",p->num);
        p = p->next;
    }
}
/*
****************尾插法建表*****************
*/
void CreatFormTail(Linklist L)
{
    printf("输入-1结束创建\n");
    int data;
    Linklist s, tail;
    tail = L;
    scanf_s("%d", &data);
    while (data != -1)
    {
        s = (Linklist)malloc(sizeof(LinkNode));
        s->num = data;
        tail->next = s;
        tail = s;
        scanf_s("%d",&data);
    }
    tail->next = NULL;
    printf("创建:\n");
    PrintList(L);
}
/*
****************遍历你要查找的第num个结点****************
*/
Linklist SearchNum(Linklist L, int num)
{
    int flag=0;
    Linklist p;
    //p = L->next;
    p = L;
    while (p->next != NULL && flag < num)
    {
        p = p->next;
        ++flag;
        break;
    }
    if (flag)
    {
        printf("查找成功\n");
        return p;
    }
    else
    {
        printf("查找失败\n");
        printf("温馨提示:请注意您输入的合理性\n");
        return NULL;
    }
}
/*
***********按值查找****************
*/
Linklist SearchValue(Linklist L, int value)
{
        Linklist p;
        int count=0;
        p = L->next;
        while (p != NULL)
        {
            if (p->num != value)
            {
                p = p->next;
            }
            else
            {
                ++count;
                /*printf("\n值为%d查找value成功!\n",value);
                printf("该数据出现的第%d次\n",count);*/
                p = p->next;
                
            }
        }
        if (count == 0)
        {
            printf("查无此值\n");
        }
        printf("您所查询的值为%d一共出现过%d次\n",value,count);
        return p;
}
/*
*********************删除 从0开始为首节点***************
*/
int DeleteNode(Linklist L,int pre,int *value)
{
    Linklist p, r;
    p = SearchNum(L, pre);
    if (p != NULL)
    {
        r = p->next;
        if (r != NULL)
        {
            p->next = r->next;
            *value = r->num;
            free(r);
            printf("删除成功\n");
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 0;
    }
    return 0;
}
void menu(Linklist L,int value)
{
    if (value == 2)
    {
        int fla;
        printf("请输入你要查的值\n");
        scanf_s("%d", &fla);
        SearchValue(L, fla);
    }
    else if (value == 3)
    {
        int fla;
        printf("请输入你要查的结点位置\n");
        scanf_s("%d", &fla);
        SearchNum(L, fla);

    }
    else if (value == 4)
    {
        int fla,x;
        printf("请输入你要删除的结点的前一个位置\n");
        scanf_s("%d", &fla);
        DeleteNode(L, fla, &x);
    }
}
int main()
{
    printf("*****************************\n");
    printf("输入6创建链表\n");
    printf("输入2按值查找\n");
    printf("输入3按位置找\n");
    printf("输入4删除结点\n");
    printf("输入5查看结点\n");
    printf("输入其他退出\n");
    printf("*****************************\n");
    Linklist LA;
    LA=InitLinklist();
    //CreatFormHead(LA);
    int Value=1,x;
    while (Value!=8)
    {
        scanf_s("%d", &Value);
        switch (Value)
        {
        case 6:
            CreatFormTail(LA);
            break;
        case 2:
            menu(LA,Value);
            break;
        case 3:
            menu(LA, Value);
            
            break;
        case 4:
            
            menu(LA, Value);
            break;
        case 5:
            PrintList(LA);
        case 8:
            break;
        }
    }
    printf("程序结束运行!\n");
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值