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

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. Android 自定义view --圆形百分比(进度条)

    转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50334595 注:本文由于是在学习过程中写的,存在大量问题(overdraw onDr ...

  2. saiku显示不出新的cube(加载的cube,saiku会保存到缓存中,不重新加载)

    当用workbench 修改cube后,保存到saiku路径. saiku读取该cube时,如果以前加载过该cube(同路径,同名).则不会新加载,而是用缓存中的cube,这个cube是以前的cube ...

  3. PDA开发数据由本地上传至DB

    private void btnUpLoad_Click(object sender, EventArgs e) { if (!System.IO.File.Exists(LoadFile)) { M ...

  4. Android百分比布局支持库(android-percent-support)

    Android中提供了五种布局,其中用的最多的就是:LinearLayout, RelativeLayout 和 FrameLayout这三种布局,在对某一界面进行布局时最先想到也是通过这三种来布局的 ...

  5. Linux引导流程(第二版)

    Linux引导流程 柱面,0磁头,1扇区 如图:] 进入这一步骤的目的是[通常,PID是随机分配的,但是init特殊,可以通过命令:ps -el | more 查看],Linux系统中init名义上可 ...

  6. Linux - 工作管理(job control),jobs,fg,bg,kill

    什么是工作管理? 『进行工作管理的行为中, 其实每个工作都是目前 bash 的子程序,亦即彼此之间是有相关性的. 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 b ...

  7. sql记录查询重复注意事项(经验提升),in的用法和效率

    sql查询重复记录,使用: select * from dimappnamenew as appn where id in (   select id   from dimappnamenew gro ...

  8. RHEL6.4安装nginx

    RHEL6.4安装nginx 下载nginx-1.6.1.tar.gz, 解压进入目录: $ yum install pcre-devel $ ./configure --with-http_ssl_ ...

  9. ios的位置和方向(来自苹果官方文档,仅供简单参考)

    取得用户的当前位置 Core Location框架使您可以定位设备的当前位置,并将这个信息应用到程序中.该框架利用设备内置的硬件,在已有信号的基础上通过三角测量得到固定位置,然后将它报告给您的代码.在 ...

  10. Python_如何去除字符串里的空格

    个人想到的解决方法有两种,一种是 .replace(' old ',' new ')  第一个参数是需要换掉的内容比如空格,第二个是替换成的内容,可以把字符串中的空格全部替换掉. 第二种方法是像这样 ...