链表

简介:

1.总结

说到数据结构,第一个想到的就是链表,因为后面所以的数据结构都是可以通过链表的形式实现。

2.时间复杂度

说到算法,第一个想到的就是效率问题,让我们简单看下时间复杂度:如果一个算法用常数时间(O(1))将问题的大小消减为其一部分(通常是二分之一),那木该算法就是O(logN),如果使用常数时间只是把问题减少一个常数(如将问题减少1),那木这种算法就是O(N)。

3.单链表(为了方便分析,链表都是带有头结点数据域不存放值)

wKiom1mvohXRSvD3AAAPrUcfeYM026.png

代码实现如下(每个函数传入指针默认不是NULL):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
node.h
 
#ifndef _LIST_
#define _LIST_
typedef  struct  node{
     int  Data;
     struct  node *Next;
}*Pnode,Node;
int  IsEmpty(Pnode L);
int  IsLast(Pnode L);
Pnode Find( int  X,Pnode L);
void  Delete( int  X,Pnode L);
Pnode FindPrevious( int  X,Pnode L);
void  HeadInsert( int  X,Pnode L,Pnode P);
void  TialInsert( int  X,Pnode L,Pnode P);
void  DisplayList(Pnode L);
Pnode MallocNode();
#endif
 
node.c
#include<stdio.h>
#include<stdlib.h>
#include"node.h"
/*申请节点*/
Pnode MallocNode()
{
     Pnode P = (Pnode) malloc ( sizeof (Node));
     if (NULL != P)
     {
         return  P;
     }
     else
     {
         return  NULL;
     }
}
/*判断是否为空*/
int  IsEmpty(Pnode L)
{
     if (L->Next == NULL)
     {
         return  0;
     }
     return  -1;
}
/*判断是否是最后一个节点*/
int  IsLast(Pnode L)
{
     if (L->Next == NULL)
     {
         return  0;
     }
     return  -1;
}
/*查找数据域为X的节点*/
Pnode Find( int  X,Pnode L)
{
     Pnode P = L->Next;
     if (0 == IsEmpty(L))
     {
         printf ( "list is empty!\n" );
         return  NULL;
     }
     while (P != NULL && P->Data != X)
         P = P->Next;
     return  P;
}
/*查找数据域为X的前驱节点*/
Pnode FindPrevious( int  X,Pnode L)
{
     Pnode P = L;
     if (0 == IsEmpty(L))
     {
         printf ( "list is empty!\n" );
         return  NULL;
     }
     while (P->Next != NULL && P->Next->Data != X )
         P = P->Next;
     return  P;
}
/*删除数据为X的节点*/
void  Delete( int  X,Pnode L)
{
     Pnode P,Temp;
     if (0 == IsEmpty(L))
     {
         printf ( "list is empty!\n" );
         return  ;
     }
     P = FindPrevious(X,L);
     if (0 != IsLast(P))
     {
         Temp = P->Next;
         P->Next = Temp->Next;
         free (Temp);
     }
     else
     {
         printf ( "no find data!\n" );
         return ;
     }
}
/*头插*/
void  HeadInsert( int  X,Pnode L,Pnode P)
{
     P->Data = X;
     if (NULL == L->Next)
     {
         L->Next = P;
         P->Next = NULL;
     }
     else
     {
         P->Next = L->Next;
         L->Next = P;
     }
}
/*尾插*/
void  TialInsert( int  X,Pnode L,Pnode P)
{
     P->Data = X;
     P->Next = NULL;
     Pnode T = L;
     while (NULL != T->Next)
         T = T->Next;
     T->Next = P;
}
/*显示链表*/
void  DisplayList(Pnode L)
{
     Pnode P = L->Next;
     while (NULL != P)
     {
         printf ( " %d" ,P->Data);
         P = P->Next;
     }
}

4.双向链表

wKiom1mvonTyi1G3AAAQfPeZTQQ068.png

5.双向循环链表

wKioL1mvommimiSsAAAO6spsgMk570.png

双向链表和双向循环链表以后用到再实现,上面的结构不对,应该有前驱指针。

1
2
3
4
5
struct  Node{
     Ele Data;
     struct  Node *Tail;
     struct  Node *Next;
}



本文转自 8yi少女的夢 51CTO博客,原文链接:http://blog.51cto.com/zhaoxiaohu/1963104,如需转载请自行联系原作者
相关文章
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
604 21
|
12天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
969 110
|
6天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。