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

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. shell脚本格式的几点注意:格式严格,空格不能随便出现(一写就记不住)

    shell脚本中,不能随意添加空格,否则出错: 1,=等号两边必须无空格.否则出错.如i =$1和i= $1都是错的.但是在()内部不限制如for ((i= 1;i < 3;i= i+1))是正 ...

  2. Java 截取中英文混合字符串

    题目: 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入&q ...

  3. spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...

  4. 《java入门第一季》之参数引用

    Java中的参数传递问题: 基本类型:形式参数的改变对实际参数没有影响. 引用类型:形式参数的改变直接影响实际参数. */ class ArgsDemo { public static void ma ...

  5. JQuery UI - resizable

     ·概述 resizable插件可以让选中的元素具有改变尺寸的功能. 官方示例地址:http://jqueryui.com/demos/resizable/ 所有的事件回调函数都有两个参数:eve ...

  6. 【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)

    准备工作: 电脑上安装好JDK.下载smali和baksmali.下载apktools.要修改的ROM.adb工具(可选) 注:由于本教程面向的对象为有一定ROM修改基础的兄弟,所以对于如何使用电脑, ...

  7. Gradle 1.12用户指南翻译——第四十四章. 分发插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. 图片像素对比OpenCV实现,实现人工分割跟算法分割图像结果的对比

    图片对比,计算不同像素个数,已经比率.实现人工分割跟算法分割图像结果的对比,但是只能用灰度图像作为输入 // imageMaskComparison.cpp : 定义控制台应用程序的入口点. // / ...

  9. android decorView详解

    摘要 一.DecorView为整个Window界面的最顶层View. 二.DecorView只有一个子元素为LinearLayout.代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域. ...

  10. SharePoint2007 开发部署Application Pages

    介绍:SharePoint应用程序页,也就是_layouts路径下的aspx页面,服务器C:\Program Files\Common Files\Microsoft Shared\web serve ...