数据结构及接口(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*);
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 Print_HeaderList(HeaderList *hlist,PRINTNODE PrintNode);
void* GetFirstVal_HeaderList(HeaderList *hlist);
int GetSize_HeaderList(HeaderList *hlist);
#endif
功能实现(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;
}
Node *p = q->next;
q->next = p->next;
p->data = NULL;
p->next = NULL;
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];
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();
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]);
MessageBoxA(NULL,TEXT("HHC回来了!"),TEXT("不好意思"),MB_ICONWARNING|MB_OK);
printf("HHC:\n");
Print_HeaderList(hhc,printMember);
exit(0);
}