本文实例为大家分享了C链表操作演示的具体代码,供大家参考,具体内容如下
头文件:link_0505.h
/* 链表演示 */ #ifndef __LINK_0505 #define __LINK_0505 typedef struct node{ int num; struct node* p_next; }node; typedef struct { node head,tail; }link; //链表的初始化函数 void link_init(link *); //链表的清理函数 void link_deinit(link *); //判断链表是否空的函数 int link_empty(link *); //判断链表是否满的函数 int link_full(link *); //统计有效数字个数的函数 int link_size(link *); //在最前边插入数字的函数 int link_add_head(link *, int ); //在最后边插入新的数字的函数 int link_append(link *, int ); //把数字按照顺序插入到链表的函数 int link_insert(link *, int); //删除最前面数字的函数 int link_remove_head(link *); //删除最后一个有效数字 int link_remove_tail(link *); //删除某个给定数字的函数 int link_remove(link *, int ); //获得第一个有效数字的函数 int link_get_head(link *, int *); //获得最后一个有效数字的函数 int link_get_tail(link *, int *); //获得指定编号数字的函数 int link_get(link *, int *, int ); #endif
实现代码: link_0505.cpp
/* 链表演示 */ #include "stdlib.h" #include "link_0505.h" //链表的初始化函数 void link_init(link *p_link) { p_link->head.p_next = &(p_link->tail); } //链表的清理函数 void link_deinit(link *p_link) { while(p_link->head.p_next != &(p_link->tail)) { node *p_first = &(p_link->head); node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; p_first->p_next = p_last; free(p_mid); p_mid = NULL; } } //判断链表是否空的函数 int link_empty(link *p_link) { return p_link->head.p_next == &(p_link->tail); } //判断链表是否满的函数 int link_full(link *p_link) { return 0; } //统计有效数字个数的函数 int link_size(link *p_link) { int cnt = 0; node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid != &(p_link->tail)) { cnt++; } } return cnt; } //在最前边插入数字的函数 int link_add_head(link *p_link, int num) { node *p_temp = (node *)malloc(sizeof(node)); if (!p_temp) { return 0; } p_temp->num = num; node *p_first = &(p_link->head); node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; p_first->p_next = p_temp; p_temp->p_next = p_mid; return 1; } //在最后边插入新的数字的函数 int link_append(link *p_link, int num) { node *p_tmp = (node *)malloc(sizeof(node)); node *p_node = NULL; if (!p_tmp) { return 0; } p_tmp->num = num; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid == &(p_link->tail)) { p_first->p_next = p_tmp; p_tmp->p_next = p_mid; break; } } return 1; } //把数字按照顺序插入到链表的函数 int link_insert(link *p_link, int num) { node* p_temp = (node *)malloc(sizeof(node)); node* p_node = NULL; if (!p_temp) { return 0; } p_temp->num = num; p_temp->p_next = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid == &(p_link->tail) || p_mid->num > p_temp->num) { p_first->p_next = p_temp; p_temp->p_next = p_mid; break; } } return 0; } //删除最前面数字的函数 int link_remove_head(link *p_link) { node *p_first = &(p_link->head); node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_link->head.p_next == &(p_link->tail)) { return 0; } p_first->p_next = p_last; free(p_mid); p_mid = NULL; } //删除最后一个有效数字 int link_remove_tail(link *p_link) { node *p_node = NULL; for (p_node = &(p_link->head);p_node !=&(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_last == &(p_link->tail)) { p_first->p_next = p_last; free(p_mid); p_mid = NULL; return 1; } } return 0; } //删除某个给定数字的函数 int link_remove(link *p_link, int num) { node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid != &(p_link->tail) && p_mid->num == num) { p_first->p_next = p_last; free(p_mid); p_mid = NULL; return 1; } } return 0; } //获得第一个有效数字的函数 int link_get_head(link *p_link, int *p_num) { if (p_link->head.p_next == &(p_link->tail)) { return 0; } node *p_first = &(p_link->head); node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; p_first->p_next = p_last; *p_num = p_mid->num; return 1; } //获得最后一个有效数字的函数 int link_get_tail(link *p_link, int *p_num) { node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_last == &(p_link->tail)) { *p_num = p_mid->num; return 1; } } return 0; } //获得指定编号数字的函数 int link_get(link *p_link, int *p_num, int num) { int cnt = 0; node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid != &(p_link->tail) && cnt == num) { *p_num = p_mid->num; return 1; } cnt++; } return 0; }
测试函数:
/* * 链表测试 * */ #include <stdio.h> #include "link_0505.h" int main() { int size = 0, num = 0, val = 0; link lnk = {0}; link_init(&lnk); link_add_head(&lnk, 30); link_add_head(&lnk, 20); link_append(&lnk, 90); link_append(&lnk, 100); link_insert(&lnk, 50); link_insert(&lnk, 60); link_insert(&lnk, 40); link_insert(&lnk, 80); link_insert(&lnk, 70); size = link_size(&lnk); for (num = 0;num <= size - 1;num++) { link_get(&lnk, &val, num); printf("%d ", val); } printf("\n"); printf("------------------"); link_remove_head(&lnk); link_remove_tail(&lnk); link_remove(&lnk, 70); size = link_size(&lnk); for (num = 0;num <= size - 1;num++) { link_get(&lnk, &val, num); printf("%d ", val); } printf("\n"); link_get_head(&lnk, &val); printf("最前面的数字是%d\n", val); link_get_tail(&lnk, &val); printf("最后面的数字是%d\n", val); link_deinit(&lnk); return 0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
主要内容:单向链表,循环链表,双向链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 使用链表结构可以避免在使用数组时需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去
本文向大家介绍C语言单链表常见操作汇总,包括了C语言单链表常见操作汇总的使用技巧和注意事项,需要的朋友参考一下 C语言的单链表是常用的数据结构之一,本文总结了单链表的常见操作,实例如下:
本文向大家介绍C语言实现数据结构和双向链表操作,包括了C语言实现数据结构和双向链表操作的使用技巧和注意事项,需要的朋友参考一下 数据结构 双向链表的实现 双向链表中的每一个结点都含有两个指针域,一个指针域存放其后继结点的存储地址,另一个指针域则存放其前驱结点的存储地址。 双向链表结点的类型描述: 其中,prior域存放的是其前驱结点的存储地址,next域存放的是其后继结点的存储地址。 双
我需要制作一个可以进行三次操作的链表。所有这三个操作都必须具有 O(1) 复杂性。 有问题的操作是: < li >添加到尾部 < li >从头部移除 < li >返回中间节点 正在使用的节点结构如下: 为了移除头部,我通过通常对头部节点的引用实现了O(1) 为了添加到尾,我通过引用尾节点实现了O(1) 我的问题是返回中间节点。我知道如何通过遍历列表来实现这一点,但这意味着它将具有O(n)复杂度。我
本文向大家介绍C语言单链表的实现,包括了C语言单链表的实现的使用技巧和注意事项,需要的朋友参考一下 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 链表结构: SList.h SList.cpp Test.cpp 以上内容是小编给大家介绍的C语言单链表的实现代码,希望对大家有所帮助!
我将创建一个可以插入并显示到现在的链接: 这是我的初始化函数,只会为第一个