c语言,数据结构,链表的一些操作总结
下面是自己的一些学习操作以及总结,能用我会很开心,有不足之处,欢迎大家提出宝贵的意见!
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语言,数据结构,链表的一些操作总结的更多相关文章
- C语言基础——链表的相关操作
1 #include <stdio.h> #include <malloc.h> #include <string.h> #include <math.h&g ...
- C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...
- C语言描述链表的实现及操作
一.链表的创建操作 // 操作系统 win 8.1 // 编译环境 Visual Stuido 2017 #include<stdio.h> #include<malloc.h> ...
- C语言之链表
这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...
- Redis数据结构—链表与字典
目录 Redis数据结构-链表与字典 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 哈希算法 解决键冲突 rehas ...
- 零基础玩转C语言单链表
下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- delphi.数据结构.链表
链表作为一种基础的数据结构,用途甚广,估计大家都用过.链表有几种,常用的是:单链表及双链表,还有N链表,本文着重单/双链表,至于N链表...不经常用,没法说出一二三来. 在D里面,可能会用Contnr ...
- JavaScript数据结构——链表的实现与应用
链表用来存储有序的元素集合,与数组不同,链表中的元素并非保存在连续的存储空间内,每个元素由一个存储元素本身的节点和一个指向下一个元素的指针构成.当要移动或删除元素时,只需要修改相应元素上的指针就可以了 ...
随机推荐
- ORM对象关系映射之GreenDAO建立多表关联
利用GreenDAO可以非常方便的建立多张表之间的关联 一对一关联 通常我们在操作数据库的时候,我们往往不是单独的对一张表进行操作,而是对这张表的操作会联动的影响另外一张表或者多张表,比如:现在有两张 ...
- Android免Root无侵入AOP框架Dexposed
Dexposed框架是阿里巴巴无线事业部近期开源的一款在Android平台下的免Root无侵入运行期AOP框架,该框架基于AOP思想,支持经典的AOP使用场景,可应用于日志记录,性能统计,安全控制,事 ...
- equal与== 个人笔记
首先看看下面的图,看清楚了图咱们要说的知识点也就说说清楚了一半 int a=10; String b="ss"; String c=new String("kkk&quo ...
- LeetCode之“树”:Validate Binary Search Tree
题目链接 题目要求: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is ...
- linux下由带-开头文件想到的
如果要删除文件-aaa,使用rm -aaa是不行的,rm会认为-后面的是参数.2种办法: 1 带明确路径指示 rm ./-aaa 2 使用 -- :rm -- -aaa 因为命令如果发现参数中有--, ...
- LeetCode(24)-Balanced Binary Tree
题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...
- 3 sum closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- 怎么分别javascript写在<head>里还是<body>里面?
怎么分别javascript写在<head>里还是<body>里面? 具体哪些语句写在<body>里,哪些语句写在<head>里 满意答案 BeginN ...
- JqueryMobile学习记录一
安装 做页面之前首先引用三个文件: <link href="/Scripts/jquery.mobile-1.4.5/jquery.mobile-1.4.5.css" rel ...
- Java反射之调用内部类
1. 反射调用默认访问权限的内部类 package com.blueStarWei.invoke; import java.lang.reflect.Method; import com.blueSt ...