Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
O
open-ccode
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
bh
open-ccode
Commits
fbd715b2
提交
fbd715b2
authored
12月 14, 2022
作者:
bh
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
完成单链表,单向循环链表,双向链表,双向循环链表的设计
上级
a3c91edb
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
455 行增加
和
29 行删除
+455
-29
.gitignore
.gitignore
+4
-0
linkList.c
node/linkList.c
+34
-29
linkListCycle.c
node/linkListCycle.c
+136
-0
twoSideCycleList.c
node/twoSideCycleList.c
+126
-0
twoSideList.c
node/twoSideList.c
+155
-0
没有找到文件。
.gitignore
0 → 100644
浏览文件 @
fbd715b2
.idea
*.out
*.o
\ No newline at end of file
node/linkList.c
浏览文件 @
fbd715b2
...
...
@@ -3,31 +3,32 @@
#include <string.h>
// 单向链表的设计
// 节点结构体
typedef
struct
node
{
int
len
;
int
len
;
// 头节点中使用,保存链表的总长度(不含头节点)
char
name
[
10
];
struct
node
*
next
;
}
Node
;
// 申请一个节点的空间
Node
*
create
(){
return
(
Node
*
)
malloc
(
sizeof
(
Node
));
}
// 初始化一个节点
Node
*
initNode
(){
Node
*
node
=
create
();
node
->
len
=
0
;
strcpy
(
node
->
name
,
"
node0
"
);
strcpy
(
node
->
name
,
"
header
"
);
node
->
next
=
NULL
;
return
node
;
}
//
//
头部插入数据
void
headInsert
(
Node
*
head
,
Node
*
newNode
){
Node
*
headNext
=
head
->
next
;
head
->
next
=
newNode
;
head
->
next
->
next
=
headNext
;
head
->
len
++
;
}
// 尾部插入数据
void
endInsert
(
Node
*
head
,
Node
*
newNode
){
Node
*
nextNode
=
head
;
while
(
nextNode
->
next
){
...
...
@@ -39,18 +40,31 @@ void endInsert(Node * head,Node * newNode){
head
->
len
++
;
}
// 删除一个节点,根据node->name去匹配对应的节点
void
delNode
(
Node
*
head
,
Node
*
delNode
){
if
(
head
->
name
==
delNode
->
name
){
// 头节点,直接返回
printf
(
"don't delete head node!
\n
"
);
return
;
}
else
if
(
head
->
next
){
// 非头节点,继续走
Node
*
nextNode
;
Node
*
thisNode
;
nextNode
=
head
;
while
(
nextNode
->
next
){
//
thisNode
=
nextNode
;
nextNode
=
nextNode
->
next
;
if
(
nextNode
->
name
==
delNode
->
name
){
if
(
nextNode
->
next
==
NULL
){
// 要删除的是最后一个节点
thisNode
->
next
=
NULL
;
free
(
nextNode
);
}
else
{
// 要删除的不是最后一个节点
thisNode
->
next
=
nextNode
->
next
;
free
(
nextNode
);
nextNode
=
thisNode
->
next
;
}
}
}
}
void
delNode
(
Node
*
head
,
char
name
[
10
]){
Node
*
nextNode
;
nextNode
=
head
;
while
(
nextNode
->
next
){
if
(
nextNode
->
name
==
name
){
nextNode
->
next
=
nextNode
->
next
->
next
;
free
(
nextNode
->
next
);
head
->
len
--
;
break
;
}
}
}
void
printNode
(
Node
*
head
){
...
...
@@ -93,21 +107,12 @@ int main()
printNode
(
head
);
printf
(
""
);
printf
(
"
=========del================
\n
"
);
delNode
(
head
,
head
);
printNode
(
head
);
return
0
;
}
node/linkListCycle.c
0 → 100644
浏览文件 @
fbd715b2
//
// Created by bh-1 on 2022/12/14.
//
#include "stdio.h"
#include "malloc.h"
#include "string.h"
// 单向循环链表
typedef
struct
node
{
int
len
;
char
name
[
10
];
struct
node
*
next
;
}
Node
;
// 申请节点内存
Node
*
create
(){
return
(
Node
*
)
malloc
(
sizeof
(
Node
));
}
Node
*
initNode
(){
Node
*
head
=
create
();
head
->
len
=
0
;
strcpy
(
head
->
name
,
"head"
);
head
->
next
=
head
;
head
->
len
++
;
return
head
;
}
// 获取循环链表的长度
int
linkLen
(
Node
*
head
){
int
len
=
1
;
Node
*
nextNode
=
head
;
while
(
nextNode
->
next
!=
head
){
len
++
;
nextNode
=
nextNode
->
next
;
}
return
len
;
}
// 插入一个链表
void
insert
(
Node
*
head
,
Node
*
newNode
){
if
(
head
->
next
==
head
){
// 只有一个头节点
head
->
next
=
newNode
;
newNode
->
next
=
head
;
}
else
{
// 超过2个节点
Node
*
nextNode
;
nextNode
=
head
;
while
(
nextNode
->
next
!=
head
){
nextNode
=
nextNode
->
next
;
}
nextNode
->
next
=
newNode
;
newNode
->
next
=
head
;
}
head
->
len
++
;
}
// 随机节点地址插入
void
randInsert
(
Node
*
beforeNode
,
Node
*
newNode
){
if
(
linkLen
(
beforeNode
)
==
1
){
// 只有一个节点,那就只能是头节点
newNode
->
next
=
beforeNode
;
beforeNode
->
next
=
newNode
;
}
else
{
// 多个节点
newNode
->
next
=
beforeNode
->
next
;
beforeNode
->
next
=
newNode
;
}
}
// 删除一个节点
void
delNode
(
Node
*
head
,
Node
*
delNode
){
if
((
linkLen
(
head
)
==
1
)
||
(
delNode
->
name
==
head
->
name
)){
// 不删除头节点
printf
(
"don't delete head node"
);
return
;
}
Node
*
nextNode
;
Node
*
thisNode
;
nextNode
=
head
;
while
(
nextNode
->
next
!=
head
){
thisNode
=
nextNode
;
nextNode
=
nextNode
->
next
;
if
(
nextNode
->
name
==
delNode
->
name
){
thisNode
->
next
=
nextNode
->
next
;
free
(
nextNode
);
head
->
len
--
;
}
nextNode
=
thisNode
;
}
}
void
printList
(
Node
*
head
){
Node
*
nextNode
;
nextNode
=
head
;
while
(
nextNode
->
next
!=
head
){
printf
(
"name=%s,len=%d,address=%p,next=%p
\n
"
,
nextNode
->
name
,
nextNode
->
len
,
nextNode
,
nextNode
->
next
);
nextNode
=
nextNode
->
next
;
}
printf
(
"name=%s,len=%d,address=%p,next=%p
\n
"
,
nextNode
->
name
,
nextNode
->
len
,
nextNode
,
nextNode
->
next
);
}
int
main
(){
Node
*
head
=
initNode
();
Node
*
node1
=
create
();
strcpy
(
node1
->
name
,
"node1"
);
insert
(
head
,
node1
);
Node
*
node2
=
create
();
strcpy
(
node2
->
name
,
"node2"
);
insert
(
head
,
node2
);
Node
*
node3
=
create
();
strcpy
(
node3
->
name
,
"node3"
);
insert
(
head
,
node3
);
Node
*
node4
=
create
();
strcpy
(
node4
->
name
,
"node4"
);
insert
(
head
,
node4
);
printList
(
head
);
printf
(
"=====================
\n
"
);
Node
*
node5
=
create
();
strcpy
(
node5
->
name
,
"node5"
);
randInsert
(
node2
,
node5
);
printList
(
head
);
return
0
;
}
node/twoSideCycleList.c
0 → 100644
浏览文件 @
fbd715b2
//
// Created by zxsh-1 on 2022/12/14.
//
#include "stdio.h"
#include "string.h"
#include "malloc.h"
// 双向循环链表
typedef
struct
node
{
int
len
;
char
name
[
10
];
struct
node
*
next
;
struct
node
*
prev
;
}
Node
;
Node
*
create
(){
return
(
Node
*
)
malloc
(
sizeof
(
Node
));
}
// 获取链表的长度
int
listLen
(
Node
*
node
){
int
i
=
1
;
Node
*
nextNode
=
node
;
while
(
nextNode
->
next
!=
node
){
i
++
;
nextNode
=
nextNode
->
next
;
}
return
i
;
}
Node
*
initNode
(){
Node
*
head
=
create
();
head
->
len
=
0
;
strcpy
(
head
->
name
,
"header"
);
head
->
next
=
head
;
head
->
prev
=
head
;
return
head
;
}
void
addNode
(
Node
*
head
,
Node
*
newNode
)
{
if
(
listLen
(
head
)
==
1
)
{
head
->
next
=
newNode
;
head
->
prev
=
newNode
;
newNode
->
next
=
head
;
newNode
->
prev
=
head
;
}
else
{
newNode
->
prev
=
head
;
newNode
->
next
=
head
->
next
;
head
->
next
->
prev
=
newNode
;
head
->
next
=
newNode
;
}
}
Node
*
delNode
(
Node
*
head
,
Node
*
delNode
){
Node
*
newHead
=
head
;
if
(
listLen
(
head
)
==
1
){
printf
(
"only one node !"
);
}
else
{
Node
*
nextNode
=
head
;
while
(
1
){
if
(
nextNode
->
name
==
delNode
->
name
){
if
(
nextNode
==
head
){
newHead
=
nextNode
->
next
;
}
nextNode
->
prev
->
next
=
nextNode
->
next
;
nextNode
->
next
->
prev
=
nextNode
->
prev
;
free
(
nextNode
);
break
;
}
nextNode
=
nextNode
->
next
;
if
(
nextNode
==
newHead
){
break
;
}
}
}
return
newHead
;
}
void
printList
(
Node
*
head
){
Node
*
nextNode
=
head
;
printf
(
"name=%s,len=%d,prev=%p,address=%p,next=%p
\n
"
,
nextNode
->
name
,
nextNode
->
len
,
nextNode
->
prev
,
nextNode
,
nextNode
->
next
);
while
(
nextNode
->
next
!=
head
){
nextNode
=
nextNode
->
next
;
printf
(
"name=%s,len=%d,prev=%p,address=%p,next=%p
\n
"
,
nextNode
->
name
,
nextNode
->
len
,
nextNode
->
prev
,
nextNode
,
nextNode
->
next
);
}
}
int
main
(){
Node
*
head
=
initNode
();
Node
*
node1
=
create
();
strcpy
(
node1
->
name
,
"node1"
);
addNode
(
head
,
node1
);
Node
*
node2
=
create
();
strcpy
(
node2
->
name
,
"node2"
);
addNode
(
head
,
node2
);
Node
*
node3
=
create
();
strcpy
(
node3
->
name
,
"node3"
);
addNode
(
head
,
node3
);
Node
*
node4
=
create
();
strcpy
(
node4
->
name
,
"node4"
);
addNode
(
head
,
node4
);
printList
(
head
);
printf
(
"------------------------------
\n
"
);
head
=
delNode
(
head
,
head
);
printList
(
head
);
return
0
;
}
node/twoSideList.c
0 → 100644
浏览文件 @
fbd715b2
//
// Created by zxsh-1 on 2022/12/14.
//
#include "stdio.h"
#include "string.h"
#include "malloc.h"
// 双向不循环链表的设计
typedef
struct
node
{
int
len
;
char
name
[
10
];
struct
node
*
next
;
struct
node
*
prev
;
}
Node
;
// 获取链表长度
int
linkLen
(
Node
*
node
){
int
i
=
1
;
while
(
node
->
next
!=
NULL
){
i
++
;
node
=
node
->
next
;
}
return
i
;
}
// 申请节点空间
Node
*
create
(){
return
(
Node
*
)
malloc
(
sizeof
(
Node
));
}
// 初始化头节点
Node
*
initHead
(){
Node
*
head
=
create
();
head
->
len
=
0
;
strcpy
(
head
->
name
,
"header"
);
head
->
next
=
NULL
;
head
->
prev
=
NULL
;
return
head
;
}
// 链表头部插入,并返回新的头节点
Node
*
headInsert
(
Node
*
head
,
Node
*
newNode
){
Node
*
newHead
=
newNode
;
head
->
prev
=
newHead
;
newHead
->
next
=
head
;
newHead
->
prev
=
NULL
;
newHead
->
len
=
head
->
len
++
;
head
->
len
=
0
;
return
newHead
;
}
// 尾部插入节点
void
endInsert
(
Node
*
head
,
Node
*
newNode
){
Node
*
nextNode
=
head
;
while
(
nextNode
->
next
!=
NULL
){
nextNode
=
nextNode
->
next
;
}
nextNode
->
next
=
newNode
;
newNode
->
prev
=
nextNode
;
newNode
->
next
=
NULL
;
head
->
len
++
;
}
Node
*
delNode
(
Node
*
head
,
Node
*
delNode
){
if
(
linkLen
(
head
)
==
1
){
printf
(
"only one head node !"
);
return
head
;
}
if
(
delNode
==
head
){
// 删除的节点是头节点
Node
*
newHead
;
head
->
next
->
prev
=
NULL
;
newHead
=
head
->
next
;
free
(
head
);
return
newHead
;
}
Node
*
nextNode
=
head
;
while
(
nextNode
->
next
)
{
nextNode
=
nextNode
->
next
;
if
(
nextNode
->
name
==
delNode
->
name
)
{
if
(
nextNode
->
next
==
NULL
)
{
// 要删除的是最后一个节点
nextNode
->
prev
->
next
=
NULL
;
free
(
nextNode
);
break
;
}
else
{
// 不是头节点,也不是尾节点
nextNode
->
prev
->
next
=
nextNode
->
next
;
nextNode
->
next
->
prev
=
nextNode
->
prev
;
free
(
nextNode
);
break
;
}
}
}
return
head
;
}
void
printLinkList
(
Node
*
head
){
Node
*
nextNode
=
head
;
while
(
nextNode
->
next
){
printf
(
"name=%s,len=%d,prev=%p,address=%p,next=%p
\n
"
,
nextNode
->
name
,
nextNode
->
len
,
nextNode
->
prev
,
nextNode
,
nextNode
->
next
);
nextNode
=
nextNode
->
next
;
}
printf
(
"name=%s,len=%d,prev=%p,address=%p,next=%p
\n
"
,
nextNode
->
name
,
nextNode
->
len
,
nextNode
->
prev
,
nextNode
,
nextNode
->
next
);
}
int
main
()
{
Node
*
head
=
initHead
();
Node
*
node1
=
create
();
strcpy
(
node1
->
name
,
"node1"
);
head
=
headInsert
(
head
,
node1
);
Node
*
node2
=
create
();
strcpy
(
node2
->
name
,
"node2"
);
head
=
headInsert
(
head
,
node2
);
Node
*
node3
=
create
();
strcpy
(
node3
->
name
,
"node3"
);
head
=
headInsert
(
head
,
node3
);
Node
*
node4
=
create
();
strcpy
(
node4
->
name
,
"node4"
);
head
=
headInsert
(
head
,
node4
);
Node
*
node5
=
create
();
strcpy
(
node5
->
name
,
"node5"
);
endInsert
(
head
,
node5
);
Node
*
node6
=
create
();
strcpy
(
node6
->
name
,
"node6"
);
endInsert
(
head
,
node6
);
Node
*
node7
=
create
();
strcpy
(
node7
->
name
,
"node7"
);
endInsert
(
head
,
node7
);
Node
*
node8
=
create
();
strcpy
(
node8
->
name
,
"node8"
);
endInsert
(
head
,
node8
);
printLinkList
(
head
);
printf
(
"-----------------------
\n
"
);
head
=
delNode
(
head
,
node6
);
printLinkList
(
head
);
return
0
;
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论