C语言高级进阶

链表是由一系列互相连接的节点组成的数据结构,这种数据结构非常有用,是实现队列和栈的基础。


学习内容

此章我们学习如何创建和使用单链表,如下代码是用来支持链表实现的结构体,Node结构体定义了一个节点,它有两个指针,第一个void*可以接受任意类型的数据,第二个是指向下一个节点的指针。LinkedList结构体表示链表,包含三个Node*指针,分别为头结点指针、尾结点指针和当前指针,其中当前指针用来辅助遍历链表。

typedef struct _node
{void* data;struct _node* next;
}Node;typedef struct _linkedList
{Node* head;Node* tail;Node* current;
}Linkedlist;

学习产出

如下示例为链表创建、初始化、头插、尾插、删除节点和链表的遍历显示:

typedef struct _employee
{char* name;unsigned char age;
}Employee;int compareEmployee(Employee* e1, Employee* e2)
{return strcmp(e1->name, e2->name);
}void displayEmployee(Employee* employee)
{printf("%s\t%d\n", employee->name, employee->age);
}typedef void(*DISPLAY)(void *);
typedef int(*COMPARE)(void*, void*);typedef struct _node
{void* data;struct _node* next;
}Node;typedef struct _linkedList
{Node* head;Node* tail;Node* current;
}Linkedlist;void initializeList(Linkedlist*);
void addHead(Linkedlist*, void*);
void addTail(Linkedlist*, void*);
void delete(Linkedlist*, Node*);
Node* getNode(Linkedlist*, COMPARE, void*);
void displayLinkedList(Linkedlist*, DISPLAY);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;if(list->head == NULL){list->tail = node;node->next = NULL;}else{node->next = list->head;}list->head = node;
}void addTail(Linkedlist* list, void* data)
{Node* node = (Node*)malloc(sizeof(Node));node->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){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* tmp = list->head;while(tmp != NULL && tmp->next != node){tmp = tmp->next;}if(tmp != NULL){tmp->next = node->next;}}free(node);node = NULL;
}void displayLinkedList(Linkedlist* list, DISPLAY display)
{printf("\nLinkedList\n");Node* current = list->head;while(current != NULL){display(current->data);current = current->next;}
}int main()
{Linkedlist linkedList1, linkedList2;Employee* e1 = (Employee*)malloc(sizeof(Employee));e1->name = "TomCat";e1->age = 13;Employee* e2 = (Employee*)malloc(sizeof(Employee));e2->name = "KittyMouse";e2->age = 16;Employee* e3 = (Employee*)malloc(sizeof(Employee));e3->name = "BabyFish";e3->age = 10;initializeList(&linkedList1);initializeList(&linkedList2);addHead(&linkedList1, e1);addHead(&linkedList1, e2);addHead(&linkedList1, e3);printf("addHead Illustrated:\n");printf("%s\t %d\n", ((Employee*)linkedList1.head->data)->name, ((Employee*)linkedList1.head->data)->age);printf("%s\t %d\n", ((Employee*)linkedList1.head->next->data)->name, ((Employee*)linkedList1.head->next->data)->age);printf("%s\t %d\n", ((Employee*)linkedList1.head->next->next->data)->name, ((Employee*)linkedList1.head->next->next->data)->age);printf("********************************************************************\n");printf("addTail Illustrated:\n");addTail(&linkedList2, e1);addTail(&linkedList2, e2);addTail(&linkedList2, e3);// printf("%s\t %d\n", ((Employee*)linkedList2.tail->data)->name, ((Employee*)linkedList2.tail->data)->age);printf("%s\t %d\n", ((Employee*)linkedList2.head->data)->name, ((Employee*)linkedList2.head->data)->age);printf("%s\t %d\n", ((Employee*)linkedList2.head->next->data)->name, ((Employee*)linkedList2.head->next->data)->age);printf("%s\t %d\n", ((Employee*)linkedList2.head->next->next->data)->name, ((Employee*)linkedList2.head->next->next->data)->age);printf("********************************************************************\n");Node* node = getNode(&linkedList1,(int(*)(void*, void*))compareEmployee, e1);delete(&linkedList1, node);printf("delete node Illustrated:\n");printf("%s\t %d\n", ((Employee*)linkedList1.head->data)->name, ((Employee*)linkedList1.head->data)->age);printf("%s\t %d\n", ((Employee*)linkedList1.head->next->data)->name, ((Employee*)linkedList1.head->next->data)->age);
/*    printf("%s\t %d\n", ((Employee*)linkedList1.head->next->next->data)->name, ((Employee*)linkedList1.head->next->next->data)->age);*/printf("********************************************************************\n");printf("diaplay Linkedlist Illustrated:\n");displayLinkedList(&linkedList2, (DISPLAY)displayEmployee);return 0;
}

运行结果如下:

单链表创建以及头插、尾插相关推荐

  1. C语言的单链表创建:头插法/尾插法

    文章目录 前言 链表头插法 链表尾插法 源码实现 前言 接下来一段时间,将对数据结构进行复习,总的来说数据结构自大学之后忘记得有点吓人,为了防止脑容量本就小得脑袋更小,必须得持续性得温故了. 链表数据 ...

  2. 单链表创建之--头插法创建带头结点的单链表

    单链表常见的创建方法有头插法和尾插法,这里记录头插法创建带头结点的单链表具体过程: 以C语言为例, 1)首先使用 typedef 关键字定义结点数据类型 typedef struct LNode{in ...

  3. 实现链表的插入——头插/尾插

    声明类: public class LinkList {LinkList next;int val;public LinkList(int val) {this.val = val;}public L ...

  4. 单链表的基本操作----------头插法/尾插法建立链表

    头插法 步骤: 1.在内存中找开辟一个空间,作为链表的头节点,将头结点滞空. 具体代码: L = (LinkList)malloc(sizeof(ND)); L -> next = NULL; ...

  5. 记录-链表头插尾插区别

    链表作为数据结构中比较重要的一种,具有操作效率高.内存利用率高.结构简单.使用方便等特点,今天我们一起交流一下单向线性表的头插法和尾插法的区别及优缺点 线性表因为每个元素都包含一个指向下一元素的指针, ...

  6. 链表的头插法和尾插法——头插尾插交替插入

    private static ListNode dummy = new ListNode(0);//头插法public static void headInsert(ListNode node){if ...

  7. 侃侃算法EP2·链表的头插尾插

    1. 前言 这个板块旨在记录一些日常中或是面试中会问到的算法和数据结构相关的内容,更多是给自己总结和需要的人分享.在内容部分可能由于我的阅历和实战经历不足,会有忽视或是写错的点,还望轻喷. 2. 内容 ...

  8. 线性表基本操作,单链表的建立(头插法,尾插法)、插入、删除、遍历操作的实现(c++ 数据结构 实验二)

    大学数据结构课程的实验题目,掌握线性表的链接存储结构,用c++语言描述 一.实验要求 1.分别用头插法和尾插法建立一个含有若干结点的单链表 2.对已建立的单链表进行插入.删除.遍历输出等操作 二.代码 ...

  9. 不带头结点的C语言单链表操作,头插法及尾插法

    接上篇带头结点的单链表操作,不带头节点真的比带头结点的麻烦好多,主要是我自己指针指的有点晕,搞了这几天的不带头结点的单链表,算是弄清楚指针的玩法了..老样子上代码. # include "s ...

最新文章

  1. Unity热门插件推荐
  2. Linux如何通过csv导入neo4j,neo4j-import导入CSV 数据
  3. php xml表格形式输出,PHP XML如何输出nice格式
  4. jsp 页面获取action 属性的方法
  5. python神经网络调节参数_神经网络进阶-用python实现一个完整的神经网络框架并在CIFAR10数据集上调参...
  6. Android 系统(115)---死机问题分析
  7. oracle11g导出空表
  8. Oracle Instant Client安装与配置
  9. 抽象代数学习 阿贝尔群
  10. 力扣 1818. 绝对差值和 数学 二分
  11. 区块链APP怎么开发?深入分析
  12. sql进行批量更新或者一条sql写出批量更新的语句
  13. Bluekeep(0708)漏洞利用发布:潘多拉盒子已经打开
  14. PFM格式图像和读取middlebury 数据集
  15. 自然科学六大基础学科:数学,物理学,化学,生物学,地球科学,天文学
  16. VisualSVN Server 自助修改密码页面
  17. OA系统开源开发框架,企业管理办公自动化开发平台
  18. UDP-无连接的传输层协议-基础知识
  19. ListView 自己定义BaseAdapter实现单选打勾(无漏洞)
  20. 计算机设备回收协议书,2019考研统考计算机操作系统设备分配与回收

热门文章

  1. 方舟机电有限公司宣布成立新国际总部以支持全球发展
  2. android高仿今日头条小视频转场切换效果
  3. 华为GaussDB数据库10个知识点,第7个你知道么?
  4. python字符分割垂直投影法_Python实现投影法分割图像示例(一)
  5. 佳能软件不用光盘安装升级包的方法
  6. 汽车营销如何破局?看懂车帝全域营销助品牌“破浪”
  7. 北京奥运会赛事电视直播表(绝对完整)--每天就抱着电视看吧!
  8. 边缘计算 | 在移动设备上部署深度学习模型的思路与注意点
  9. pandas中isin()函数及其逆函数使用
  10. 新版手机离线地图GPS定位程序