实现了基本的单链表的:初始化,指定定位置添加结点,指定位置删除结点,按值查找返回指针。插入、删除位置均从0开始计数。
其中初始化使用了带头结点的链表,深刻体会到头结点的好处,
- 统一了第一个位置上和其余位置上的操作,都可以用 node-> 的操作,无需对头指针特殊操作。
- 对空表和非空表的操作得到了统一,判断条件都是node->next== NULL。
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int value;
struct _node *next;
} Node;
void print(Node *hNode);//输出链表
Node *InitList(); //头插法建立链表。-1表示输入结束
void InsertNode(Node *p, int loc, int num);//在第i个位置上插入一个结点,该结点的value是num;(位置从0开始)
void DeleteNode(Node *hNode, int loc); //删除结点
Node *LocateElem(Node *hNode, int a);//按值查找
int main() {
//初始化链
Node *hNode = InitList();
printf("初始化链表:");
print(hNode);
//链中插入结点
InsertNode(hNode, 3, 7);
printf("\n插入结点后:");
print(hNode);
Node *p = LocateElem(hNode, 7);
printf("\n查找的目标是%d", p->value);
//删除结点
DeleteNode(hNode, 3 );
printf("\n删除结点后:");
print(hNode);
}
Node *InitList() {
int number;
Node *hNode = (Node *)malloc(sizeof(Node)); //hNode是指向头结点的指针
hNode->value = 0;
hNode->next = NULL;
do {
scanf("%d", &number);
if (number != -1) {
Node *p = (Node *)malloc(sizeof(Node));
p->value = number;
p->next = hNode->next;
hNode->next = p;//如果改用头指针,则需要对指针赋值,将指针指向第一个结点。
}
} while (number != -1);
return hNode;
}
void InsertNode(Node *p, int loc, int num) { //p是指向头结点的头指针
int i = 0;
Node *index = p;//index指向头结点,头结点不计算在链长内
Node *q = (Node *)malloc(sizeof(Node));//q为新结点
q->value = num;
if (index->next == NULL) {
index->next = q;
q->next = NULL;
} else {
while (index->next) {
if (i == loc) {
q->next = index->next;
index->next = q;
break;
} else {
index = index->next;
i++;
}
}
}
}
void DeleteNode(Node *hNode, int loc) {
int i = 0;
Node *p = hNode->next;
Node *q = hNode;//q指向p的前一个结点
if (p->next == NULL) {
printf("删除失败");
} else {
while (p->next) {
if (i == loc) {
if (i == 0)
q->next = p->next;
else
q->next = p->next;
free(p);
break;
} else {
q = p;
p = p->next;
i++;
}
}
}
}
Node *LocateElem(Node *hNode, int a) {
int i = 0;
Node *p = hNode->next;
if (p == NULL) {
printf("查找失败");
return NULL;
}
while (p->next && p->value != a) {
p = p->next;
}
return p;
}
void print(Node *hNode) {
Node *p = hNode->next;
while (p) {
printf("%d ", p->value);
p = p->next;
}
}