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实现的更多相关文章

  1. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...

  5. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  6. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  7. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  8. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  9. 用JavaScript来实现链表LinkedList

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...

  10. 数据结构:队列 链表,顺序表和循环顺序表实现(python版)

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

随机推荐

  1. nginx补丁格式说明(CVE-2016-4450为例)

    nginx安全公告地址:http://nginx.org/en/security_advisories.html CVE-2016-4450:一个特定构造的数据包,可引发nginx引用空指针,导致ng ...

  2. PyQt+Html+Js

    先做记录,后面有时间在仔细研究 https://www.cnblogs.com/jiangjh5/p/7209315.html?utm_source=itdadao&utm_medium=re ...

  3. linux git:fatal: HTTP request failed

    问题 问题的出现比较奇怪 我一台电脑 git clone   没问题 另外一台电脑  git  clone  有问题 解决 yum update nss nss-util nspr 参考 https: ...

  4. linux的典型分支:

    1.redhat 2.debian 3.centOS 4.ubuntu 5.fedora 6.kali linux

  5. laravel中的plicy授权方法:

    1.用命令新建policy: php artisan make:policy PostPolicy 2.在app/Policies/PostPolicy.php中添加处理文件的权限的方法: //修改: ...

  6. Win10系列:JavaScript 动画1

    在应用程序中使用动画会使应用显得更加生动,进而给用户带来良好的视觉效果.例如,当用户将某个项添加到列表时,新项不会立即出现在列表中,而是采用动画形式到达相应位置,并且列表中的其他项也采用动画形式移动到 ...

  7. java字符串根据空格截取并存进ArrayList,并在每个元素前后加上/

    public class List { public static void main(String[] args) { String s = "abc nnn ooo/xzsxc bs&q ...

  8. Linux运维工程师需要掌握什么才能胜任工作呢

    万丈高楼平地起,所有一切的高深的技术都离不开最基本的技术,那么作为运维工程师的你,什么是最基本的技术呢,毫无疑问是Linux,Linux 是你所有一切技术的根源,试想一下如果你连基础的操作命令都不知道 ...

  9. 7.2 C++模板类实例化

    参考:http://www.weixueyuan.net/view/6399.html 总结: array < int >表明用int类型来代替模板类中的类参数“T”,编译器会将模板类ar ...

  10. python三目运算符

    python 可通过 if 语句来实现三目运算符的功能,因此可以近似地把这种if语句当成三目运算符.作为三目运算符的 if 语句的语法格式如下: True_statements if expressi ...