数据结构 链表 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 @ 2011-11-14 15:09  朱旭东  阅读(350)  评论(0编辑  收藏  举报