数据结构 链表 c实现

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

typedef struct
{
    char key[10];
    char name[20];
    int age;
}Data;

typedef struct Node    //定义链表结构
{
    Data nodeData;
    struct Node *nextNode;
}CLType;

CLType *CLAddEnd(CLType *head,Data nodeData)//追加节点
{
    CLType *node,*htemp;
    if(!(node=(CLType*)malloc(sizeof(CLType))))
    {
        printf("申请内存失败!\n");
        return NULL;
    }
    else
    {
        node->nodeData=nodeData;
        node->nextNode=NULL;
        if(head==NULL)
        {
            head=node;
            return head;
        }
        htemp=head;
        while(htemp->nextNode!=NULL)
        {
            htemp=htemp->nextNode;
        }
        htemp->nextNode=node;
        return head;
    }
}
CLType *CLAddFirst(CLType *head,Data nodeData)//插入头结点
{
    CLType *node;
    if(!(node=(CLType*)malloc(sizeof(CLType))))
    {
        printf("申请内存失败!\n");
        return NULL;
    }
    else
    {
        node->nodeData=nodeData;
        node->nextNode=head;
        head=node;
        return head;
    }
}
CLType *CLFindNode(CLType *head,char *key)//查找节点
{
    CLType *htemp;
    htemp=head;
    while(htemp)
    {
        if(strcmp(htemp->nodeData.key,key)==0)
        {
            return htemp;
        }
        htemp=htemp->nextNode;
    }
    return NULL;
}

CLType *CLInsertNode(CLType *head,char *findkey,Data nodeData)//插入节点
{
    CLType *node,*nodetemp;
    if(!(node=(CLType*)malloc(sizeof(CLType))))
    {
        printf("申请内存失败!");
        return NULL;
    }
    node->nodeData=nodeData;
    nodetemp=CLFindNode(head,findkey);
    if(nodetemp)
    {
        node->nextNode=nodetemp->nextNode;
        nodetemp->nextNode=node;
    }
    else
    {
        printf("未找到正确的插入位置!\n");
        free(node);
    }
    return head;
}
int CLDeleteNode(CLType *head,char *key)//删除节点
{
    CLType *node,*htemp;
    htemp=head;
    node=head;
    while(htemp)
    {
        if(strcmp(htemp->nodeData.key,key)==0)
        {
            node->nextNode=htemp->nextNode;
            free(htemp);
            return 1;
        }else
        {
            node=htemp;
            htemp=htemp->nextNode;
        }
    }
    return 0;
}

int CLLength(CLType *head)//计算链表长度
{
    CLType *htemp;
    int Len=0;
    htemp=head;
    while(htemp)
    {
        Len++;
        htemp=htemp->nextNode;
    }
    return Len;
}

void CLAllNode(CLType *head)//显示所有节点
{
    CLType *htemp;
    Data nodeData;
    htemp=head;
    printf("当前链表共有%d个节点。链表所有数据如下:\n",CLLength(head));
    while(htemp)
    {
        nodeData=htemp->nodeData;
        printf("节点(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age);
        htemp=htemp->nextNode;
    }
}

int main()
{
    CLType *node,*head=NULL;
    Data nodeData;
    char key[10];char findkey[10];

    printf("先输入链表中各数据,格式为:学号 姓名 年龄\n");
    do
    {
        fflush(stdin);
        scanf("%s",nodeData.key);
        if(strcmp(nodeData.key,"0")==0)
        {
            break;
        }
        else
        {
            scanf("%s%d",nodeData.name,&nodeData.age);
            head=CLAddEnd(head,nodeData);
        }
    }while(1);
    CLAllNode(head);
    fflush(stdin);
    printf("\n输入插入的节点的关键字:");
    scanf("%s",findkey);
    printf("\n输入插入节点的数据:学号 姓名 年龄:");
    scanf("%s%s%d",nodeData.key,nodeData.name,&nodeData.age);
    head=CLInsertNode(head,findkey,nodeData);
    CLAllNode(head);

    printf("\n输入要删除节点的关键字:");
    //fflush(stdin);
    scanf("%s",key);
    CLDeleteNode(head,key);
    CLAllNode(head);

    printf("\n输入查找节点的关键字:");
    //fflush(stdin);
    scanf("%s",key);
    node=CLFindNode(head,key);
    if(node)
    {
        nodeData=node->nodeData;
        printf("关键字%s对应的节点为(%s,%s,%d)\n",key,nodeData.key,nodeData.name,nodeData.age);
    }
    else{
        printf("在链表中找不到关键字为%s的节点\n",key);
    }
}

posted @   朱旭东  阅读(352)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示