C语言实现单向链表

C语言实现单向链表

图:武汉加油!中国必赢!

Guderian出品

完整代码

如图所示

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
/*
* Presented by G-SS-Hacker
* Share it if you like
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//为节点申请内存空间
#define NEW(x) NODE *x = (NODE *)malloc(sizeof(NODE))
//释放内存空间
#define DEL(x) free(x); x = NULL
//检查是否成功申请内存
#define JUD(x) if(x==NULL) exit(0)

typedef struct node //结构体:节点
{
int data; //数据
char name[20]; //名称
struct node *next; //后继节点指针
}NODE;

typedef struct list //结构体:链表
{
NODE *head; //头节点指针
NODE *tail; //尾节点指针
int len; //链表长度
}LIST;

//初始化链表
void InitList(LIST *list);
//在链表尾部插入一个节点
void PushBack(LIST *list, int *data, const char name[]);
//在链表尾部弹出一个节点
void PopBack(LIST *list);
//在指定位置后插入一个节点
void InsertNode(LIST *list, int pos, int *data, const char name[]);
//删除指定位置的节点
void DeleteNode(LIST *list, int pos);
//访问指定位置的节点
NODE *GetNode(LIST *list, int pos);
//打印整个链表
void PrintList(LIST *list);

int main()
{
LIST list = {NULL, NULL, 0};
InitList(&list);
/* 对链表的操作
int a1 = 123, a2 = 456;
char c1[20] = "汤姆\0", c2[20] = "杰克\0";
PushBack(&list, &a1, c1);
PushBack(&list, &a2, c2);
NODE *p = GetNode(&list, 1);
PopBack(&list);
InsertNode(&list, 0, &a2, c2);
PushBack(&list, &a2, c2);
DeleteNode(&list, 1);
PrintList(&list);
*/

return 0;
}
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
void InitList(LIST *list)
{
NEW(node);
JUD(node);
node->next = NULL;

list->head = node;
list->tail = node;
}

void PushBack(LIST *list, int *data, const char name[])
{
NEW(node);
JUD(node);
node->data = *data;
strcpy(node->name, name);
node->next = NULL;

list->tail->next = node;
list->tail = node;
list->len++;
}

void PopBack(LIST *list)
{
//检查非法输入
if (!list->len)
return ;

NODE *p = list->head;
while(p->next!=list->tail)
p = p->next;

DEL(list->tail);
list->tail = p;
list->tail->next = NULL;
list->len--;
}

void InsertNode(LIST *list, int pos, int *data, const char name[])
{
//检查非法输入
if (list->len<pos || pos<0)
return ;

//是否在链表尾部插入节点
if (pos==list->len)
{
PushBack(list, data, name);
return ;
}

NODE *p = list->head;
for(;pos;pos--)
p = p->next;

NEW(node);
JUD(node);
node->data = *data;
strcpy(node->name, name);
node->next = p->next;
p->next = node;
list->len++;
}

void DeleteNode(LIST *list, int pos)
{
//检查非法输入
if (list->len<pos || !pos)
return ;

//是否在链表尾部删除节点
if (pos==list->len)
{
PopBack(list);
return ;
}

NODE *p = list->head;
for(--pos;pos;pos--)
p = p->next;

NODE *tmp = p->next;
p->next = tmp->next;
DEL(tmp);
list->len--;
}

NODE *GetNode(LIST *list, int pos)
{
//检查非法输入
if (list->len<pos || pos<0)
return NULL;

printf("第%d个节点为", pos);
NODE *p = list->head;
for(;pos;pos--)
p = p->next;
printf("%.4d %s\n", p->data, p->name);

return p;
}

void PrintList(LIST *list)
{
//检查非法输入
if (!list->len)
return ;

NODE *p = list->head->next;
while(p!=NULL)
{
printf("%.4d %s\n", p->data, p->name);
p = p->next;
}
}

取消主函数中的注释,输出结果为:

1
2
3
1个节点为0123 汤姆
0123 汤姆
0456 杰克

【更多C语言系列】

本文标题:C语言实现单向链表

文章作者:G-SS-Hacker

发布时间:2020年02月27日 - 17:18:18

最后更新:2020年02月27日 - 17:45:25

原始链接:https://G-SS-Hacker.github.io/C语言实现单向链表/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。