抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

链表由节点构成,单链表中的节点包含着数据和next指针,写成结构体的形式就是

1
2
3
4
5
typedef int ElemType;
typedef struct _Node {
ElemType data;
struct _Node *next;
} Node;

初始化链表

1
2
3
4
5
6
Node *InitList() {
Node *L = (Node *)malloc(sizeof(Node));
L->data = 0;
L->next = NULL;
return L;
}

插入

插入的方法分为:头插、尾插、任意插。

头插法

注意:一定是先让目标节点P的next指向后继节点,再让前驱节点的next指向P,不然后继节点的地址会被覆盖掉。

1
2
3
4
5
6
void HeadInsert(Node *L, ElemType e) {
Node *P = (Node *)malloc(sizeof(Node));
P->data = e;
P->next = L->next;
L->next = P;
}

尾插法

1
2
3
4
5
6
7
8
9
10
void *TailInsert(Node *L, ElemType e) {
Node *P = L, *Tail = (Node *)malloc(sizeof(Node));
while (P->next) {
P = P->next;
}

P->next = Tail;
Tail->data = e;
Tail->next = NULL;
}

任意位置插入

1
2
3
4
5
6
7
8
9
void Insert(Node *L, int index, ElemType e) {
Node *P = L, *Q = (Node *)malloc(sizeof(Node));
for (int i = 0; i < index - 1; i++) {
P = P->next;
}
Q->next = P->next;
P->next = Q;
Q->data = e;
}

遍历

1
2
3
4
5
6
7
8
void Traverse(Node *L) {
Node *P = L->next;
while (P!=NULL) {
printf("%c", P->data);
P = P->next;
}
printf("\n");
}

删除

1
2
3
4
5
6
7
8
9
void Delete(Node *L, int index) {
Node *P = L;
for (int i = 0; i < index - 1; i++) {
P = P->next;
}
Node *Q = P->next;
P->next = Q->next;
free(Q);
}

销毁

1
2
3
4
5
6
7
8
void Destory(Node *L) {
Node *P = L, *Q;
while (P) {
Q = P->next;
free(P);
P = Q;
}
}

查找

1
2
3
4
5
6
7
8
9
10
int Find(Node *L, ElemType e) {
Node *P = L;
int index = 0;
while (P) {
P = P->next;
index++;
if (P->data == e) return index;
}
return -1;
}

评论