链表之链式存储
时间:2022-04-22
本文章向大家介绍链表之链式存储,主要内容包括数据结构声明、链表读取指定位置的元素、链表整表的删除、链表在指定位置插入节点、链表删除指定位置的节点、完整的示例代码、运行结果、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
优点:
1 空间存储方便,现用现申请
2 插入删除,只针对单一数据,不需要移动大量数据
缺点:
1 读取,插入,删除慢,需要从头查找,时间复杂度均为O(n)
数据结构声明
typedef struct Node{
int data;
struct Node * next;
}Node;
int main(){
...
Node *p = (Node *)malloc(sizeof(Node));
p->data = 1;
...
}
链表读取指定位置的元素
void getNode(Node *L,int n,Node *tar){
int i=1;
Node *p;
p=L->next;
while(p && i<n){
p=p->next;
i++;
}
if(!p || i>n)
printf("error!");
tar->data=p->data;
}
链表整表的删除
链表不能直接删除头结点,此时元素节点仍在使用中。
void clearList(Node *L){
Node *p,*q;
p=L->next;
while(p){
q=p->next;
free(p);
p=q;
}
L->next=NULL;
}
链表在指定位置插入节点
int insertNode(Node *L,int n,int num){
int i=1;
Node *p = L->next;
while( p && i<n-1){
p=p->next;
i++;
}
if(!p || i>n-1)
return 0;
Node *q = (Node *)malloc(sizeof(Node));
q->data = num;
q->next = p->next;
p->next = q;
return 1;
}
链表删除指定位置的节点
int deleteNode(Node *L,int n){
int i=1;
Node *p = L->next;
Node *q;
while( p->next && i<n-1){
p=p->next;
i++;
}
if( !(p->next) || i>n-1)
return 0;
q=p->next;
p->next = q->next;
free(q);
return 1;
}
完整的示例代码
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct Node{
5 int data;
6 struct Node * next;
7 }Node;
8
9 void createList(Node * L,int len);
10 void showList(Node *L);
11 void clearList(Node *L);
12 void getNode(Node *L,int n,Node *tar);
13 int insertNode(Node *L,int n,int num);
14 int deleteNode(Node *L,int n);
15
16 int main()
17 {
18 Node *L= (Node *)malloc(sizeof(Node));
19
20 createList(L,5);
21 showList(L);
22
23 Node *tar= (Node *)malloc(sizeof(Node));
24 getNode(L,3,tar);
25 printf("the third is:%dn",tar->data);
26
27 if(insertNode(L,3,0))
28 showList(L);
29
30 if(deleteNode(L,3))
31 showList(L);
32
33 clearList(L);
34 showList(L);
35
36 return 0;
37 }
38
39 void createList(Node * L,int len){
40 int i;
41 Node * p;
42 L->next = NULL;
43 for(i=0;i<len;i++){
44 p = (Node *)malloc(sizeof(Node));
45 p->data = 2*i+1;
46 p->next = L->next;
47 L->next = p;
48 }
49 }
50
51 void showList(Node *L){
52 Node *p = (Node *)malloc(sizeof(Node));
53 p=L->next;
54 while(p){
55 printf("%d->",p->data);
56 p=p->next;
57 }
58 printf("nulln");
59 free(p);
60 }
61
62 void clearList(Node *L){
63 Node *p,*q;
64 p=L->next;
65 while(p){
66 q=p->next;
67 free(p);
68 p=q;
69 }
70 L->next=NULL;
71 }
72
73 void getNode(Node *L,int n,Node *tar){
74 int i=1;
75 Node *p;
76 p=L->next;
77 while(p && i<n){
78 p=p->next;
79 i++;
80 }
81 if(!p || i>n)
82 printf("error!");
83 tar->data=p->data;
84 }
85
86 int insertNode(Node *L,int n,int num){
87 int i=1;
88 Node *p = L->next;
89 while( p && i<n-1){
90 p=p->next;
91 i++;
92 }
93 if(!p || i>n-1)
94 return 0;
95 Node *q = (Node *)malloc(sizeof(Node));
96 q->data = num;
97 q->next = p->next;
98 p->next = q;
99 return 1;
100 }
101
102 int deleteNode(Node *L,int n){
103 int i=1;
104 Node *p = L->next;
105 Node *q;
106 while( p->next && i<n-1){
107 p=p->next;
108 i++;
109 }
110 if( !(p->next) || i>n-1)
111 return 0;
112 q=p->next;
113 p->next = q->next;
114 free(q);
115 return 1;
116 }
运行结果
- Docker系列教程14-Docker数据持久化
- Docker 学习系列二之基本管理
- Docker系列教程13-Docker可视化管理工具
- Ubuntu 16.04 安装VNC
- 使用Feign实现Form表单提交
- Ubuntu 16.04 Install OpenCV
- Spring Cloud各组件调优参数
- 手把手教你设置 IntelliJ IDEA 的彩色代码主题
- 实用技巧:Hystrix传播ThreadLocal对象(两种方案)
- OpenDaylight与Mininet应用实战之流表操作
- 使用Spring Cloud Feign上传文件
- 用 TensorFlow 让你的机器人唱首原创给你听
- Spring Cloud限流详解(附源码)
- 手动安装Docker 17.06
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C语言俄罗斯方块(旧版本)
- 线性表--顺序表--数组(三)
- 算法复杂度(二)
- 线性表--顺序表--单向链表(四)
- C语言俄罗斯方块(新版本完整代码)
- 线性表--顺序表--双向链表(六)
- C/C++什么时候使用二级指针,你知道吗?
- 萌新学习C++容易漏掉的知识点,看看你中招了没有(一)
- 萌新不看会后悔的C++string字符串常用知识点总结
- salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)
- CodeForces - 260C
- 疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree
- STL常用对象,不会搞得C++跟没学一样
- 桥接模式
- CF--思维练习--CodeForces - 220C Little Elephant and Shifts (STL模拟)