栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构:单向链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构:单向链表

#include 
#include 
#include 
typedef struct _employee{
    char name[32];
    unsigned char age;
}Employee;//定义员工结构体

typedef struct _node{
    void*data;
    struct _node *next;
}Node;//定义节点结构体

typedef struct _linkedList{
    Node *head;
    Node *tail;
    Node *current;
}LinkedList;//定义链表结构体
typedef void(*DISPLAY)(void*);//定义函数指针
typedef int(*COMPARE)(void*,void*);//定义函数指针
void initializeList(LinkedList*);//链表初始化函数
void addHead(LinkedList*,void*);//给链表添加头节点
void addTail(LinkedList*,void*);//给链表添加尾节点
void delete(LinkedList*,Node*);//删除链表中的节点
Node *getNode(LinkedList*,COMPARE,void*);//获取节点结构体指针
void displayLinkedList(LinkedList*,DISPLAY);//显示链表节点
int compareEmployee(Employee *e1,Employee* e2);//比较链表中的数据,相同返回0,不同返回1
void displayEmployee(Employee* employee);//显示员工结构体
int main() {
    LinkedList linkedList;
    Employee *samuel=(Employee*)malloc(sizeof (Employee));
    strcpy(samuel->name,"Samuel");
    samuel->age=32;
    Employee *sally=(Employee*)malloc(sizeof (Employee));
    strcpy(sally->name,"Sally");
    sally->age=28;
    Employee *susan=(Employee*)malloc(sizeof (Employee));
    strcpy(susan->name,"Susan");
    susan->age=45;

    initializeList(&linkedList);
    addHead(&linkedList,samuel);
    addHead(&linkedList,sally);
    addHead(&linkedList,susan);
    addTail(&linkedList,susan);
   // Node* node=getNode(&linkedList,(int(*)(void*,void*))compareEmployee,susan);
    //Node* node1=getNode(&linkedList,(int(*)(void*,void*))compareEmployee,sally);
    //delete(&linkedList,node);
    //delete(&linkedList,node1);
    //addHead(&linkedList,susan);
    //addHead(&linkedList,samuel);


    displayLinkedList(&linkedList,(DISPLAY)displayEmployee);
    return 0;
}
int compareEmployee(Employee *e1,Employee* e2){
    return strcmp(e1->name,e2->name);
}
void displayEmployee(Employee* employee){
    printf("%st%dn",employee->name,employee->age);
}
void initializeList(LinkedList* list){//链表结构体体成员初始化
    list->head=NULL;//链表头节点初始化
    list->tail=NULL;//链表尾节点初始化
    list->current=NULL;//链表当前节点初始化
}
void addHead(LinkedList* list,void* data){//给链表添加新的头节点
    Node* node=(Node*)malloc(sizeof(Node));//给新节点申请空间
    node->data=data;//将员工结构体指针添加到新节点的data段
    if(list->head==NULL){//如果刚开始没有节点,即链表为空
        list->tail=node;//则将新节点添加到链表的尾部
        node->next=NULL;//将新节点的下一节点设置为空
    } else{
        node->next=list->head;//否则将当前链表的头节点添加到新节点的next成员变量中
    }
    list->head=node;//将新节点添加到链表表头
}
void addTail(LinkedList* list,void* data){//给链表添加新的尾节点
    Node* node=(Node*)malloc(sizeof (Node));//为新节点申请空间
    node->data=data;//将员工结构体指针添加到新节点的data段
    node->next=NULL;//将新节点的下一节点设置为空
    if(list->head==NULL){//如果刚开始没有节点,即链表为空
        list->head=node;//则将新节点设置为链表的头节点
    } else{
        list->tail->next=node;//否则将新节点设置为当前链表的尾部节点的下一节点
    }
    list->tail=node;//将当前链表的尾节点设置为新节点
}
Node* getNode(LinkedList *list,COMPARE compare,void* data){//查找节点
    Node* node=list->head;//将新节点设置为链表头节点
    while(node!=NULL){//如果节点不为空
        if(compare(node->data,data)==0){//则比较链表中的data数据段,相同则返回节点
            return node;
        }
        node=node->next;//如果不同,继续寻找下一节点
    }
    return NULL;//如果节点为空,则返回空节点
}
void delete(LinkedList* list,Node* node){//删除节点
    if(node==list->head){//如果要删除的节点为链表头节点
        if(list->head->next==NULL){//且当前链表仅有一个节点
            list->head=list->tail=NULL;//则将链表置空
        } else{
            list->head=list->head->next;//否则,将下一节点置为当前链表的头结点
        }
    } else{//如果不是要删除的节点不是当前链表的头结点
        Node* temp=list->head;//将当前链表的头节点设置为新节点
        while(temp!=NULL&&temp->next!=node){//当链表不为空,且当前节点的下一节点不是要删除的节点时
            temp=temp->next;//继续寻找下一节点是不是要删除的节点
        }
        if(temp!=NULL){
            temp->next=node->next;//将要删除的节点的下一节点赋值给要删除节点的上一节点的next指针
        }
    }
    free(node);//释放要删除节点的空间
}
void displayLinkedList(LinkedList* list,DISPLAY display){//显示链表
    printf("nLinked Listn");
    Node *current=list->head;
    while(current!=NULL){
        display(current->data);
        current=current->next;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951662.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号