链表 c实现
linklist.h
- #ifndef _LINKLIST_H_
- #define _LINKLIST_H_
- typedef int data_t;
- typedef struct node{
- data_t data;
- struct node *next;
- }NODE;
- NODE *linklist_create();
- int linklist_is_empty(NODE *head);
- int linklist_is_full(NODE *head);
- int linklist_length(NODE *head);
- void linklist_clear(NODE *head);
- int linklist_insert(NODE *head, data_t data, int offset);
- int linklist_data_delete(NODE *head, data_t data);
- int linklist_offset_delete(NODE *head, int offset);
- int linklist_data_change(NODE *head, data_t old_data, data_t new_data);
- int linklist_offset_change(NODE *head, data_t data, int offset);
- int linklist_data_search(NODE *head, data_t data);
- //NODE *linklist_data_search(NODE *head, data_t data);
- data_t linklist_offset_search(NODE *head, int offset);
- void linklist_show(NODE *head);
- void linklist_destory(NODE **head);
- void linklist_invert(NODE *head);
- #endif
linklist.c
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <strings.h>
- #include "linklist.h"
- NODE *linklist_create()
- {
- NODE *head = (NODE *)malloc(sizeof(NODE));
- if (NULL == head) {
- printf("malloc failed!\n");
- return NULL;
- }
- bzero(head, sizeof(NODE));
- head->data = -;
- head->next = NULL;
- return head;
- }
- int linklist_is_empty(NODE *head)
- {
- /*
- if (NULL == head->next) {
- return 1;
- }
- return 0;
- */
- return head->next == NULL;
- }
- int linklist_is_full(NODE *head)
- {
- return ;
- }
- int linklist_length(NODE *head)
- {
- NODE *p = head->next;
- int len = ;
- while (NULL != p) {
- len++;
- p = p->next;
- }
- return len;
- }
- void linklist_clear(NODE *head)
- {
- NODE *p = head->next;
- NODE *q = NULL;
- while (NULL != p) {
- q = p->next;
- free(p);
- p = q;
- }
- head->next = NULL;
- }
- int linklist_insert(NODE *head, data_t data, int offset)
- {
- /*判断插入的位置是否有效*/
- int len = linklist_length(head);
- if ( > offset || offset > len) {
- printf("offset invalid!\n");
- return -;
- }
- /*给想要插入的元素开辟空间,并赋值*/
- NODE *p = (NODE *)malloc(sizeof(NODE));
- if (NULL == p) {
- printf("malloc failed!\n");
- return -;
- }
- bzero(p, sizeof(NODE));
- p->data = data;
- p->next = NULL;
- /*找到插入位置的前一个位置*/
- NODE *q = head;
- int i;
- for (i = ; i < offset; i++) {
- q = q->next;
- }
- /*在找到的位置后面插入结点*/
- p->next = q->next;
- q->next = p;
- return ;
- }
- int linklist_data_delete(NODE *head, data_t data)
- {
- /*找到想要删除的元素的位置*/
- int offset = linklist_data_search(head, data);
- if (- == offset) {
- printf("search failed!\n");
- return -;
- }
- /*查找删除位置的前一个位置*/
- NODE *p = head;
- int i;
- for (i = ; i < offset; i++) {
- p = p->next;
- }
- #if 0
- NODE *p = head;
- while (NULL != p->next) {
- if (p->next->data == data) {
- break;
- }
- p = p->next;
- }
- if (p->next == NULL) {
- return -;
- }
- #endif
- /*让删除位置的前一个结点指向后一个结点的位置*/
- NODE *q = p->next;
- p->next = q->next;
- /*释放这个位置*/
- free(q);
- q = NULL;
- return ;
- }
- int linklist_offset_delete(NODE *head, int offset)
- {
- /*判断offset的值是否有效*/
- int len = linklist_length(head);
- if ( > offset || offset > len-) {
- printf("offset invalid!\n");
- return -;
- }
- /*查找删除位置的前一个位置*/
- NODE *p = head;
- int i;
- for (i = ; i < offset; i++) {
- p = p->next;
- }
- /*让删除位置的前一个结点指向后一个结点的位置*/
- NODE *q = p->next;
- p->next = q->next;
- /*释放这个位置*/
- free(q);
- q = NULL;
- return ;
- }
- int linklist_data_change(NODE *head, data_t old_data, data_t new_data)
- {
- /*找到想要修改元素的位置*/
- int offset = linklist_data_search(head, old_data);
- if (- == offset) {
- printf("search failed!\n");
- return -;
- }
- /*直接修改这个数据*/
- NODE *p = head->next;
- int i;
- for (i = ; i < offset; i++) {
- p = p->next;
- }
- p->data = new_data;
- return ;
- }
- int linklist_offset_change(NODE *head, data_t data, int offset)
- {
- /*判断offset的值是否有效*/
- int len = linklist_length(head);
- if ( > offset || offset > len-) {
- printf("offset invalid!\n");
- return -;
- }
- /*直接修改这个数据*/
- NODE *p = head->next;
- int i;
- for (i = ; i < offset; i++) {
- p = p->next;
- }
- p->data = data;
- return ;
- }
- int linklist_data_search(NODE *head, data_t data)
- {
- /*从第一个有效数据开始查找, 直到表结束,找到则返回查找到的位置*/
- NODE *p = head->next;
- int offset = ;
- while (NULL != p) {
- if (data == p->data) {
- return offset;
- }
- offset++;
- p = p->next;
- }
- return -;
- }
- /*
- NODE *linklist_data_search(NODE *head, data_t data)
- {
- 从第一个有效数据开始查找, 直到表结束,找到则返回查找到的位置
- NODE *p = head->next;
- while (NULL != p) {
- if (data == p->data) {
- return p;
- }
- p = p->next;
- }
- return NULL;
- }
- */
- data_t linklist_offset_search(NODE *head, int offset)
- {
- /*判断offset的值是否有效*/
- int len = linklist_length(head);
- if ( > offset || offset > len-) {
- printf("offset invalid!\n");
- return -;
- }
- /*找到这个位置,并返回这个位置的值*/
- NODE *p = head->next;
- int i;
- for (i = ; i < offset; i++) {
- p = p->next;
- }
- return p->data;
- }
- void linklist_show(NODE *head)
- {
- NODE *p = head->next;
- while (NULL != p) {
- printf("%d, ", p->data);
- p = p->next;
- }
- printf("\n");
- }
- void linklist_destory(NODE **head)
- {
- linklist_clear(*head);
- free(*head);
- *head = NULL;
- }
- void linklist_invert(NODE *head)
- {
- NODE *p = head;
- NODE *q = head->next;
- p->next = NULL;//意思是第一个插入的元素的指针位已经是空了(因为头插法第一个插入的元素会变成最后一个元素。)
- NODE *t = NULL;
- while (NULL != q) {
- t = q->next;
- q->next = p->next;
- p->next = q;
- q = t;
- }
- }
调用main.c
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <strings.h>
- #include "linklist.h"
- int main()
- {
- NODE *head = linklist_create();
- if (NULL == head) {
- printf("create failed!\n");
- return -;
- }
- int n = ;
- while (n--) {
- if (- == linklist_insert(head, n+, )) {
- printf("insert failed!\n");
- break;
- }
- }
- linklist_show(head);
- if (- == linklist_insert(head, , )) {
- printf("insert failed!\n");
- return -;
- }
- linklist_show(head);
- if (- == linklist_data_change(head, , )) {
- printf("change data failed!\n");
- return -;
- }
- linklist_show(head);
- if (- == linklist_offset_change(head, , )) {
- printf("change offset failed!\n");
- return -;
- }
- linklist_show(head);
- if (- == linklist_data_delete(head, )) {
- printf("change data failed!\n");
- return -;
- }
- linklist_show(head);
- if (- == linklist_offset_delete(head, )) {
- printf("change offset failed!\n");
- return -;
- }
- linklist_show(head);
- linklist_invert(head);
- linklist_show(head);
- linklist_destory(&head);
- return ;
- }
链表 c实现的更多相关文章
- Redis链表实现
链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结
防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- C语言之链表list
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- 用JavaScript来实现链表LinkedList
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...
- 数据结构:队列 链表,顺序表和循环顺序表实现(python版)
链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...
随机推荐
- ActiveMQ 消息的重新投递
正常情况下:consumer 消费完消息后,会发送"标准确认"给 broker,这个确认对象以 MessageAck 类表征: // 省略其他代码.类中定义了各种确认的类型 pub ...
- vsftp的安装与配置
1.安装 直接使用yum安装,如果没有网络在其他机器使用yum先离线下载即可,vsftpd一般就自己不需要装其他依赖包 rpm -qa|grep vsftpd #查看是否安装 yum install ...
- idea中deBug方法
1 2设置controller层断点鼠标左键点击,断点在哪里,就会deBug到哪里 3刷新页面 4查看 5service层设置断点 6 7查看返回信息是否错误
- parfor slice
http://www.mathworks.cn/cn/help/distcomp/advanced-topics.htmlPARFOR loops work by dividing the itera ...
- Mac上搭建nginx教程
1.安装Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/in ...
- Win10系列:JavaScript综合实例2
在项目中添加一个名为pages的文件夹,并在pages文件夹里面再添加一个名为mainPage的文件夹,接着在mainPage文件夹里添加一个"页面控制"项,命名为mainPage ...
- unity中自制模拟第一人称视角
public float sensitivityX = 5f; public float sensitivityY = 5f; public float sensitivetyKeyBoard = 0 ...
- [Linux]Linux下rsync服务器和客户端配置
一.rsync简介 Rsync(remote sync)是UNIX及类UNIX平台下一款神奇的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异( ...
- caffe blob
Blob,包括输入数据.输出数据.权值等: Blob是Caffe中处理和传递实际数据的数据封装包,并且在CPU与GPU之间具有同步处理能力.从数学意义上说,blob是按C风格连续存储的N维数组. ca ...
- dapper 简单多表查询
public List<Book> GetBookList() { List<Book> bList = null; try { using (var t = new SqlC ...