数据结构及接口(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(); //HHCsleep(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);
}

C语言实现带表头节点的链表相关推荐

  1. 带表头节点单链表及其基本应用

    带表头节点单链表及其基本应用 结构体及其宏定义和所需要的C语言库 #include <stdio.h> #include <stdlib.h> #define ERROR 0 ...

  2. c语言中头结点不为零怎么写,C语言不带表头结点的单链表操作

    什么是链表 简单理解为链表的功能与数组功能相似用来存储数据,链表作为一种基本的数据结构在程序开发过程当中经常会使用到.对C语言来说链表的实现主要依靠结构体(可以存储多种数据类型)和指针,所以本文相关内 ...

  3. C语言编程题—N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:求出平均分,由函数值返回。例如,若学生的成绩是:85,76,69,85,91,

    C语言编程题 设计程序,N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点.请编写函数fun,它的功能是:求出平均分,由函数值返回.例如,若学生的成绩是:85,76,69,85 ...

  4. 带哨兵节点的链_【算法导论】10.2不带哨兵节点和带哨兵节点的双向链表

    不带哨兵节点的双向链表即一般的双向链表,有一个头指针指向第一个节点,每个节点有key值和两个指针next和pre,分别指向前后相邻的节点,头结点的pre=NULL,尾节点的next=NULL,比较明了 ...

  5. C语言单链成绩表,【查找链表面试题】面试问题:C语言基于单链… - 看准网

    传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给大家总结下为什么你们学习C语言会觉得难,尤其是对于单链表这块,主要原因得是因为一下两 ...

  6. 十字交叉链表c语言,C语言课程设计报告—十字交叉链表的应用.doc

    C语言课程设计报告-十字交叉链表的应用 PAGE \* MERGEFORMAT 13 华中科技大学计算机科学与技术学院 C语言程序设计课程设计实验报告 题目:水产品养殖信息管理系统 专业: 计算机科学 ...

  7. 算法练习day10——190328(根据指定值划分单链表、复制含有rand指针节点的链表、两个单链表相交)

    1.将单向链表按某值划分成左边小. 中间相等. 右边大的形式 [题目] 给定一个单向链表的头节点head, 节点的值类型是整型, 再给定一个整数pivot. 实现一个调整链表的函数, 将链表调整为左部 ...

  8. 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来

    题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...

  9. C语言线性表之循环单链表

    #include<stdio.h> #include<stdlib.h>int typeOfLinkList;typedef struct LNode{int data;str ...

最新文章

  1. spell_picture3.1版本windows上手动拼图的软件的升级
  2. QIIME 2教程. 31名词Glossary(2020.11)
  3. 4.4 开发模式下的测试:简化我们对链码的测试过程
  4. 高级PM分析足记的成长周期,你的产品距离火爆还有多久?
  5. MySQL数据库优化实战
  6. scala中的隐式转换、隐式参数和隐式类
  7. 字节流转化为文件流_字节流转成字符串之后,在通过字符串转成字节流后的文件为什么会不一样?...
  8. 有感于“用界面线程去更新界面元素”
  9. 【泡泡Docker乐园】使用泡泡Docker基础镜像放心大胆地开发吧!
  10. 运用软件配置管理加强风险管理
  11. 删除服务器的文件夹,删除服务器上的文件夹
  12. 小程序向数组中添加数据
  13. 论文解读:Making Pre-trained Language Models Better Few-shot Learners(LM-BFF)
  14. OpenWrt的USB网口驱动使用
  15. IMT和北京大学微纳电子学研究院持续开展战略合作,三位优秀学生获2017年度MEMS专项奖学金
  16. 广州科二化龙考场_广州化龙科目二?
  17. char类型的大小范围
  18. Linux命令之在终端查看「天气预报」
  19. 2015新交规扣分标准规定
  20. Win11下安装Perl语言并实现运行

热门文章

  1. 2019年了桌面CPU还吊打笔记本CPU?真相了
  2. 使用微软官方工具下载最新系统(win10为例)
  3. linux安装liinuxrar教程,linux操作系统下RAR的安装和使用
  4. 【心理咨询师考试笔记】操作技能(四)——心理咨询方法
  5. 聊聊大学室友在 TikTok 的工作和生活体验
  6. 动态gif图如何裁剪?一个小窍门教你在线裁剪动图
  7. java 微信图片盗链破解_隐藏图片地址,伪造来路Referer实现绕过微信图片的防盗链机制...
  8. 简单的HANGMAN游戏
  9. 如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版教程】
  10. 弘辽科技:提升销量没流量要继续提升吗?如何提高店铺流量?