/** |
002 |
*
@todo c链表操作:CURD |
003 |
*
@author Koma |
004 |
**/ |
005 |
#include<stdio.h> |
006 |
#include<stdlib.h> |
007 |
008 |
typedef struct node{ |
009 |
int data; |
010 |
struct node
*next; |
011 |
}LNode,
*LinkList; |
012 |
013 |
/** |
014 |
*
初始化并创建一个带头节点的链表 |
015 |
**/ |
016 |
LinkList
init( int len
) { |
017 |
int i; |
018 |
LinkList
p, r, list; |
019 |
list
= (LinkList) malloc ( sizeof (LNode)); |
020 |
list->next
= NULL; |
021 |
for (
i = 0; i < len; i++ ) { |
022 |
p
= (LinkList) malloc ( sizeof (LNode)); |
023 |
p->data
= i+1; |
024 |
p->next
= NULL; |
025 |
if (
!list->next ) { |
026 |
list->next
= p; //赋值头节点 |
027 |
} else { |
028 |
r->next
= p; |
029 |
} |
030 |
r
= p; //移动r指针,指向下一个节点 |
031 |
} |
032 |
return list; |
033 |
} |
034 |
035 |
/** |
036 |
*
插入元素 |
037 |
*
@param int n 插入的位置 |
038 |
*
@param int e 插入的值 |
039 |
**/ |
040 |
void insertEle(
LinkList l, int n, int e
) { |
041 |
LinkList
p, q, ele; |
042 |
int i
= 1; |
043 |
ele
= (LinkList) malloc ( sizeof (LNode)); |
044 |
ele->data
= e; |
045 |
ele->next
= NULL; |
046 |
p
= q = l->next; |
047 |
|
048 |
if (
n == 1 ) { //将元素添加到链表头 |
049 |
l->next
= ele; |
050 |
ele->next
= q; |
051 |
return ; |
052 |
} |
053 |
while (
i != n && q->next != NULL ) { |
054 |
p
= q; |
055 |
q
= q->next; |
056 |
i++; |
057 |
} |
058 |
if (
i == n ) { |
059 |
p->next
= ele; |
060 |
ele->next
= q; |
061 |
} else if (
i < n ) { //将元素添加到链表尾 |
062 |
q->next
= ele; |
063 |
} |
064 |
} |
065 |
066 |
/** |
067 |
*
删除节点 |
068 |
*
@param int n 欲删除节点的位置 |
069 |
**/ |
070 |
void delNode(
LinkList l, int n
) { |
071 |
LinkList
p, q; |
072 |
int i
= 1; |
073 |
p
= q = l->next; |
074 |
if (
n == 1 ) { |
075 |
l->next
= q->next; |
076 |
} else { |
077 |
while (
i != n && q->next != NULL ) { |
078 |
p
= q; |
079 |
q
= q->next; |
080 |
i++; |
081 |
} |
082 |
if (
i == n ) { |
083 |
p->next
= q->next; |
084 |
} |
085 |
} |
086 |
} |
087 |
088 |
/** |
089 |
*
修改节点 |
090 |
*
@param int n 欲修改节点的位置 |
091 |
*
@param int e 修改值 |
092 |
**/ |
093 |
void updateNode(
LinkList l, int n, int e
) { |
094 |
LinkList
q; |
095 |
int i
= 1; |
096 |
q
= l->next; |
097 |
while (
i != n && q->next != NULL ) { |
098 |
q
= q->next; |
099 |
i++; |
100 |
} |
101 |
if (
i == n ) { |
102 |
q->data
= e; |
103 |
} |
104 |
} |
105 |
106 |
/** |
107 |
*
打印链表 |
108 |
**/ |
109 |
void printLink(
LinkList l ) { |
110 |
LinkList
q; |
111 |
q
= l->next; |
112 |
while (
q->next != NULL ) { |
113 |
printf ( "%d
" ,
q->data); |
114 |
q
= q->next; |
115 |
} |
116 |
printf ( "%d\n" ,
q->data); //打印最后一个元素 |
117 |
} |
118 |
119 |
int main()
{ |
120 |
LinkList
l; |
121 |
l
= init(5); |
122 |
printLink(l); |
123 |
insertEle(l,
6, 10); |
124 |
printLink(l); |
125 |
delNode(l,
2); |
126 |
printLink(l); |
127 |
updateNode(l,
6, 22); |
128 |
printLink(l); |
129 |
return 0; |
130 |
} |