C语言实现带表头节点的链表

数据结构及接口(Header_List.h)

#ifndef HEADER_LIST_H_INCLUDED
#define HEADER_LIST_H_INCLUDED

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

typedef struct Node{
    void *data;
    struct Node *next;
}Node;

typedef struct HeaderList{
    Node *head;
    int Hsize;
}HeaderList;

typedef void(*PRINTNODE)(void*);   //定义函数指针,参数为void* (任意类型的数据指针)

HeaderList* Create_HeaderList(void);
void Destroy_HeaderList(HeaderList *hlist);
void Clear_HeaderList(HeaderList *hlist);

void InsertByPos_HeaderList(HeaderList *hlist,int pos,void *newVal);
void DeleteByPos_HeaderList(HeaderList *hlist,int pos);
void* GetValByPos_HeaderList(HeaderList *hlist,int pos);
//void* FindByVal_HeaderList(HeaderList *hlist,void *data);

void Print_HeaderList(HeaderList *hlist,PRINTNODE PrintNode);
void* GetFirstVal_HeaderList(HeaderList *hlist);
int GetSize_HeaderList(HeaderList *hlist);

#endif // HEADER_LIST_H_INCLUDED

功能实现(Header_List.c)

#include "Header_List.h"

HeaderList* Create_HeaderList(void){

    HeaderList* hlist = (HeaderList*)malloc(sizeof(HeaderList));
    hlist->Hsize = 0;

    hlist->head = (Node*)malloc(sizeof(Node)); //带表头结点 注意表头节点没有标号
    hlist->head->data = NULL;
    hlist->head->next = NULL;

    return hlist;
}

void Destroy_HeaderList(HeaderList *hlist){

    if(hlist == NULL){
        fprintf(stderr,"The list is not inited(NULL),can't Destroy it.\n");
        return ;
    }

    Clear_HeaderList(hlist);

    free(hlist->head);
    free(hlist);
}

void Clear_HeaderList(HeaderList *hlist){

    while(GetSize_HeaderList(hlist) != 0)
        DeleteByPos_HeaderList(hlist,0);
}


void InsertByPos_HeaderList(HeaderList *hlist,int pos,void *newVal){

    if(hlist == NULL){
        fprintf(stderr,"The list is not inited(NULL),can't InsertByPos.\n");
        return ;
    }

    if(pos < 0  ||  pos > hlist->Hsize){
        fprintf(stderr,"parameter pos is INVALID,can't InsertByPos.\n");
        return ;
    }

    if(newVal == NULL){
        fprintf(stderr,"parameter newVal is NULL,can't InsertByPos.\n");
        return ;
    }

    Node *p = hlist->head;
    for(int i=0;i<pos;i++){
        p = p->next;
    }

    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = newVal;
    newNode->next = p->next;

    p->next = newNode;

    hlist->Hsize ++;
}


void DeleteByPos_HeaderList(HeaderList *hlist,int pos){

    if(hlist == NULL){
        fprintf(stderr,"The list is not inited(NULL),can't DeleteByPos.\n");
        return ;
    }

    if(pos < 0  ||  pos > hlist->Hsize-1){
        fprintf(stderr,"parameter pos is INVALID,can't DeleteByPos.\n");
        return ;
    }

    Node *q = hlist->head;
    for(int i=0;i<pos;i++){
        q = q->next;
    } // q指向要删除节点的前一个
    Node *p = q->next;  //p指向要删除的节点

    q->next = p->next;

    p->data = NULL;  // 先清空再释放
    p->next = NULL;  //千万不要free(p->data)
    free(p);    //这会导致堆内存管理出问题,也容易有漏洞

    hlist->Hsize --;
}


void* GetValByPos_HeaderList(HeaderList *hlist,int pos){

    if(hlist == NULL){
        fprintf(stderr,"The list is not inited(NULL),can't DeleteByPos.\n");
        return NULL;
    }

    if(pos < 0  ||  pos > hlist->Hsize-1){
        fprintf(stderr,"parameter pos is INVALID,can't DeleteByPos.\n");
        return NULL;
    }

    Node *p = hlist->head;
    for(int i=0;i<=pos;i++){
        p = p->next;
    }
    return p->data;
}

void Print_HeaderList(HeaderList *hlist,PRINTNODE PrintNode){

    if(hlist == NULL){
        fprintf(stderr,"The list is not inited(NULL),can't Print.\n");
    }

    Node *p = hlist->head->next;
    while(p != NULL){
        PrintNode(p->data);
        p = p->next;
    }
}

void* GetFirstVal_HeaderList(HeaderList *hlist){
    return hlist->head->next->data;
}

int GetSize_HeaderList(HeaderList *hlist){
    return hlist->Hsize;
}


功能测试(main.c)

#include "Header_List.h"
#include <windows.h>

typedef struct TEAM_MEMBER{
    char *name;
    unsigned int age;
    unsigned int rank;
} Member;

void printMember(void *data){
    Member* p = (Member*)data;
    printf("Name:%s\tAge:%d\tRank:%d\n",p->name,p->age,p->rank);
}


void test_HeaderList(){

    Member hhc_member[6];                              //注:0号作为战队创始人
//专业辅助淡
    hhc_member[0].name = "zyh";
    hhc_member[0].age = 21;
    hhc_member[0].rank = 1900;
//厂长附体周
    hhc_member[1].name = "zth";
    hhc_member[1].age = 21;
    hhc_member[1].rank = 1850;
//信仰黄金鬼
    hhc_member[2].name = "zyf";
    hhc_member[2].age = 20;
    hhc_member[2].rank = 1700;
//钻石大神浓
    hhc_member[3].name = "wyn";
    hhc_member[3].age = 20;
    hhc_member[3].rank = 2250;
//炒饭带师岳
    hhc_member[4].name = "yqi";
    hhc_member[4].age = 21;
    hhc_member[4].rank = 2350;
//美服高手森
    hhc_member[5].name = "wjs";
    hhc_member[5].age = 21;
    hhc_member[5].rank = 2200;

    HeaderList *hlist = Create_HeaderList();
    for(int i=0;i<6;i++)
        InsertByPos_HeaderList(hlist,i,&hhc_member[i]);

    Member *founder = GetFirstVal_HeaderList(hlist);
    Member *jungle = GetValByPos_HeaderList(hlist,1);
    printf("2012年,HHC战队诞生,创始人是%s\n\n",founder->name);
    printf("LOL S4-S7世界赛,HHC战队参赛名单如下:\n");
    Print_HeaderList(hlist,printMember);
    printf("\n");

    printf("我们有%d名队员。\n",GetSize_HeaderList(hlist));
    printf("我们的1号选手是小厂长 %s\n",jungle->name);
    printf("\n");
    system("pause");

    system("cls");
    printf("S8赛季中期,鬼哥暂时前往AFG战队担任教练,不能上场。参赛人员变更。\n\n");
    DeleteByPos_HeaderList(hlist,2);
    printf("变更后,HHC可上场人员如下:\n\n");
    Print_HeaderList(hlist,printMember);
    printf("\n");
    system("pause");

    system("cls");
    printf("\n\n某年,HHC战队夺得世界赛冠军,战队成员光荣退役,HHC解散。\n");
    Destroy_HeaderList(hlist);
    printf("\n虽然HHC战队解散了,但是他们的传说永存于世\n\n\n\n\n");
}

int main(){

    char code[18];
    char secret_code[18] = {"hhc_never_disband"};
    memset(code,0,18);
    test_HeaderList(); //HHC
    sleep(2);
    int select = MessageBoxA(NULL,TEXT("就这样结束吗?"),TEXT("怎么办"),MB_ICONINFORMATION|MB_YESNO);

    if (select == IDNO)

        fflush(stdin);
        printf("输入神秘代码:");
        fgets(code,18,stdin);

        if(!strcmp(code,"hhc_never_disband"))
            HHC_is_back();

    MessageBoxA(NULL,TEXT(">_<"),TEXT("GG"),MB_ICONERROR|MB_OK);


    return 0;
}

void HHC_is_back(){

    sleep(2);
    system("cls");
    system("color a");
    printf("你:不!HHC不会解散!\n\n");
    sleep(3);
    printf("随缘:我来助你一臂之力!\n");
    printf("随缘:两极反转!!!!!!\n\a");
    sleep(2);

    system("tree C:/"); //
    printf("\n\n\n\n\n\n\n\n\n\n\n\n");

    Member hhc_member[6];
//专业辅助淡
    hhc_member[0].name = "zyh";
    hhc_member[0].age = 21;
    hhc_member[0].rank = 1900;
//厂长附体周
    hhc_member[1].name = "zth";
    hhc_member[1].age = 21;
    hhc_member[1].rank = 1850;
//信仰黄金鬼
    hhc_member[2].name = "zyf";
    hhc_member[2].age = 20;
    hhc_member[2].rank = 1700;
//钻石大神浓
    hhc_member[3].name = "wyn";
    hhc_member[3].age = 20;
    hhc_member[3].rank = 2250;
//炒饭带师岳
    hhc_member[4].name = "yqi";
    hhc_member[4].age = 21;
    hhc_member[4].rank = 2350;
//美服高手森
    hhc_member[5].name = "wjs";
    hhc_member[5].age = 21;
    hhc_member[5].rank = 2200;


    HeaderList *hhc = Create_HeaderList();
    for(int i=0;i<6;i++)
        InsertByPos_HeaderList(hhc,i,&hhc_member[i]);

//  printf("对不起,HHC回来了!\a\a\a\n");
    MessageBoxA(NULL,TEXT("HHC回来了!"),TEXT("不好意思"),MB_ICONWARNING|MB_OK);
    printf("HHC:\n");
    Print_HeaderList(hhc,printMember);

    exit(0);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章