下面是自己的一些学习操作以及总结,能用我会很开心,有不足之处,欢迎大家提出宝贵的意见!

c语言链表是一种基本的数据结构,与顺序表一样属于线性表,但是顺序表在内存中的存储单元是连续的,这样就对内存的要求比较高,而链表就不一样了,它能够很好的解决这些缺点,唯一不足就是访问元素的效率不如顺序表来的那么高,但也只是相对而言!而且,链表对于后面的二叉树,图等意义重大,他们之间的联系都是非常紧密的,下面我来给出链表的一些操作。

1、链表的存储结构由数据和指针组成一个节点,每一个指针指向下一个节点,这样环环相扣就形成了链表

typedef int T;
//链表节点

typedef struct Node
{
T data;
struct Node* next;
}Node,*Link;

这段是链表的节点定义。

2、

//创建一个链表,返回的是头指针。
Link createlink()
{
Node* link=(Node*)malloc(sizeof(Node));
link->next=NULL;
return link;

}

3、

//判断链表是否为空
bool isempty(Link link)
{
return link->next==NULL;
}

4、

//获得链表元素的个数
size_t size(Link link)
{
size_t num=0;
Link p=link->next;
while(p!=NULL)
{
num++;
p=p->next;
}
return num;
}

5、

//获得index前一个节点,这里的这个函数获得的节点是指定位置前一个节点
Node* getnode(Link link,int index)
{

Link p=link;

for(int i=1;i<=index;i++)
{
p=p->next;
}
return p;

}

6、

//插入元素到指定位置 index从0开始到size()
bool insert(Link link,int index,T value)
{
if(index>size(link)||index<0)
{
return false;
}
Link s=(Node*)malloc(sizeof(Node)),q;

q=getnode(link,index);//调用上面的函数获取节点。
s->data=value;
s->next=q->next;
q->next=s;
return true;

}

7、//下面分别是在链表头插或者是尾部插入元素,也可以使用上面的另index为0或者为链表长度即可!

bool insertback(Link link,T value)
{
Link s=(Node*)malloc(sizeof(Node));
s->data=value;
s->next=link->next;
link->next=s;
}
bool insertfront(Link link,T value)
{
Link s=(Node*)malloc(sizeof(Node));
Link r=link;
while(r->next!=NULL)
{
r=r->next;
}
s->data=value;
r->next=s;
r=s;
r->next=NULL;

}

8、

//更新链表下标为index的节点值
bool update(Link link,int index,T value)
{

if(index>size(link)-1||index<0)
{
return false;
}
Link s=getnode(link,index);
Node* q=s->next;
q->data=value;
free(q);
return true;
}

9、

//删除指定下标的元素
bool deletelink(Link link,int index)
{
if(index>size(link)-1||index<0)
{
return false;
}
Node* s=getnode(link,index);
Node* q=s->next;
s->next=q->next;
free(q);

}

10、

//删除value的所有节点
bool deletedatas(Link link,T value)
{
Node* node=link->next;
Node* prenode=link;
bool flag=false;
while(node!=NULL)
{
if(node->data==value)
{
prenode->next=node->next;
Node* tmp=node;
node=node->next;
free(tmp);
flag=true;
continue;
}
prenode=node;
node=node->next;

}
return true;
}

11、

//删除value的第一次元素
bool deletedata(Link link,T value)
{

/*int index=indexof(link,value);
if(-1==index)
{
return false;
}

Link s=getnode(link,index);
Node* q=s->next;
s->next=q->next;
free(q);
return true;*/
Node* node=link->next;
Node* prenode=link;
while(node!=NULL)
{
if(node->data==value)
{
prenode->next=node->next;
free(node);
return true;
}
prenode=node;
node=node->next;
}
return false;

}

//查找是否存在value元素
bool isexists(Link link,T value)
{
// if(isempty(link))return false;
Node* node=link->next;
while(node!=NULL)
{
if(node->data==value)
{
return true;
}
node=node->next;
}
return false;

}
int indexof(Link link,T value)
{
Node* node=link->next;
int index=0;
while(node!=NULL)
{
if(node->data==value)
{
return index;
}
index++;
node=node->next;
}
return -1;
}

12、

//遍历输出
void travel(Link link)
{
Node* node=link->next;
while(node!=NULL)
{
printf("%d ",node->data);
node=node->next;
}
printf("\n");
}

13、

//逆序
void reverse(Link link)
{
//Node* pprevnode=link;
if(link==NULL||link->next==NULL)
{
return;
}
//记录前一个节点
Node* prevnode=link->next;
//记录当前节点
Node* node=prevnode->next;
//只要当前节点存在
while(node!=NULL)
{//先记录当前节点的后一节点
Node* nextnode=node->next;
//让当前节点的下一个节点指向前一个节点
node->next=prevnode;
prevnode=node;
node=nextnode;

}
//让原来的第一个元素变为尾元素,尾元素的下一个置空
link->next->next=NULL;
//让链表的头节点指向原来的尾巴元素
link->next=prevnode;
}

14、

//清空链表
void clear(Link link)
{
Node* node=link->next;
while(node!=NULL)
{
Node* tmp=node;
node=node->next;
free(tmp);
}
link->next=NULL;
}

//销毁
void destroy(Link link)
{
clear(link);
free(link);
link=NULL;
}

15、需要加入的头文件

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

最后,有什么问题欢迎大家提问和提出意见,也欢迎大家补充!

c语言,数据结构,链表的一些操作总结的更多相关文章

  1. C语言基础——链表的相关操作

    1 #include <stdio.h> #include <malloc.h> #include <string.h> #include <math.h&g ...

  2. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  3. C语言描述链表的实现及操作

    一.链表的创建操作 // 操作系统 win 8.1 // 编译环境 Visual Stuido 2017 #include<stdio.h> #include<malloc.h> ...

  4. C语言之链表

    这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...

  5. Redis数据结构—链表与字典

    目录 Redis数据结构-链表与字典 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 哈希算法 解决键冲突 rehas ...

  6. 零基础玩转C语言单链表

    下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...

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

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

  8. delphi.数据结构.链表

    链表作为一种基础的数据结构,用途甚广,估计大家都用过.链表有几种,常用的是:单链表及双链表,还有N链表,本文着重单/双链表,至于N链表...不经常用,没法说出一二三来. 在D里面,可能会用Contnr ...

  9. JavaScript数据结构——链表的实现与应用

    链表用来存储有序的元素集合,与数组不同,链表中的元素并非保存在连续的存储空间内,每个元素由一个存储元素本身的节点和一个指向下一个元素的指针构成.当要移动或删除元素时,只需要修改相应元素上的指针就可以了 ...

随机推荐

  1. 【算法导论】单源最短路径之Bellman-Ford算法

    单源最短路径指的是从一个顶点到其它顶点的具有最小权值的路径.我们之前提到的广度优先搜索算法就是一种无权图上执行的最短路径算法,即在所有的边都具有单位权值的图的一种算法.单源最短路径算法可以解决图中任意 ...

  2. 让Oracle 大小写敏感 表名 字段名 对像名

    一.解决方案 1.在表名.字段名.对象名上加上双引号,即可实现让oracle大小写区分. 2.但是这又引起了另一个问题:在数据库操作中,sql语句中相应的表名.字段名.对象名上一定要加双引号. 解决办 ...

  3. Java反射---对象池

    在很多Java  EE 框架中都需要根据配置文件信息来创建Java对象,从配置文件读取的只是i某个类的字符串类名,程序就需要根据该字符串来创建对应的实例,就必须使用反射. 下面程序就实现了一个简单的对 ...

  4. 43个优秀的Swift开源项目推荐

    "轮子" 工具类 项目 开发者 备注 SwiftyJSON tangplin, lingoer GitHub 上最为开发者认可的 JSON 解析类 Dollar.swift Ank ...

  5. LAV Filter 源代码分析 3: LAV Video (1)

    LAV Video 是使用很广泛的DirectShow Filter.它封装了FFMPEG中的libavcodec,支持十分广泛的视频格式的解码.在这里对其源代码进行详细的分析. LAV Video ...

  6. win7待机时间设置,睡眠时间设置

    首先,单击"开始"找到"控制面板" 步骤阅读 2 打开"控制面板"以后,单击右侧的"硬件和声音" 步骤阅读 3 找到&q ...

  7. Android热补丁技术—dexposed原理简析(手机淘宝采用方案)

    上篇文章<Android无线开发的几种常用技术>我们介绍了几种android移动应用开发中的常用技术,其中的热补丁正在被越来越多的开发团队所使用,它涉及到dalvik虚拟机和android ...

  8. SharePoint 2007 制作值班表

    背景:公司有了新项目,其中有一块是值班表,简单地说,就是客户需要安排值班,希望把所有的值班安排好,输入到网站中,然后每天发布出来,方便大家看:一开始看到需求,觉得应该用程序去实现,后来想想,其实挺简单 ...

  9. 关于Html5发展和应用前景

    现在的HTML5就像当年崭露头角时的Ajax,有人在做,但不知道叫它什么.最近,苹果在 HTML5上大做文章,而著名的Web设计师Eric Meyer则提出了Web Stacks的概念.Alex Ke ...

  10. Spring 学习笔记---Bean的生命周期

    生命周期图解 由于Bean的生命周期经历的阶段比较多,我们将通过一个图形化的方式进行描述.下图描述了BeanFactory中Bean生命周期的完整过程: Bean 的生命周期从Spring容器着手实例 ...