点击查看代码
#include<cstdio>
#include<stdlib.h> //malloc()
//链表结点定义
struct node {
int data; //数据域
node* next; //指针域
};
//创建链表,将Array[]每个元素存入链表的每个结点内
node* create(int Array[]) {
node* p, * pre, * head; //p指向当前结点,pre指向当前结点的前驱结点,head指向头结点
head = new node; //创建头结点
head->next = NULL; //头结点数据域不存储数据,指针域初始为NULL
pre = head; //使pre指向head
for (int i = 0; i < 5; i++) {
p = new node; //新建结点p
//将Array[i]的值赋给p的数据域
p->data = Array[i]; //新结点p数据域存储Array[i]
p->next = NULL; //新结点p指针域指向NULL
pre->next = p; //结点pre指针域指向结点p
pre = p; //然后pre移至p处,作为下一个结点p的前驱结点
}
return head; //返回链表的头结点指针
}
//在以head为头结点的链表中,统计数据域等于x的结点个数
int search(node* head, int x) {
int count = 0; //计数器
node* p = head->next; //从第1个结点开始
while (p != NULL) {
if (p->data == x) {
count++; //当前结点数据域等于x,count加一
}
p = p->next; //p后移一个结点,继续查找
}
return count; //返回count数据
}
//在以head为头结点的链表的第pos个位置上插入x
//头结点位置是0,插入完成后第pos个位置的元素是x
void insert(node* head, int pos, int x) {
node* p = head;
for (int i = 0; i < pos - 1; i++) {
p = p->next; //pos-1是插入位置的前驱结点
}
node* q = new node; //q是要插入的结点
q->data = x; //q的数据域存储元素x
q->next = p->next; //先令q指向p的下一个结点
p->next = q; //再令p的下一个结点指向q,即把q插到p后面
}
//删除以head为头结点的链表中所有数据域为x的结点
void del(node* head, int x) {
node* p = head->next; //p从第1个结点开始枚举
node* pre = head; //pre指向p的前驱结点
while (p != NULL) {
if (p->data == x) { //p结点数据域为x,则删除p结点
pre->next = p->next; //先令pre指向p的后继结点
delete(p); //再删除p结点(删除的是该结点内存,指针p变量还能使用)
p = pre->next; //然后令p指向pre的后继结点,继续向后扫描
}
else { //p结点数据域不是x,则继续向后扫描
pre = p; //先令pre指向p
p = p->next; //再令p指向p的后继结点
}
}
}
int main() {
/* 申请动态内存
//把要申请的内存大小x传给malloc(x),然后函数返回一个指向这块内存空间的void*指针
//最后将void*指针强制转换为需要使用的类型
node* p = (node*)malloc(sizeof(node)); //用指针p指向申请的动态内存地址
free(p); //动态内存使用完要释放内存
node* p1 = new node; //用指针p1指向new运算符申请动态内存
delete(p1); //动态内存使用完要释放内存
*/
int Array[5] = { 5,3,6,1,2 };
node* L = create(Array); //新建链表L,返回的头指针head赋给L,L:5 3 6 1 2
/*
L = L->next; //L后移一个结点准备输出结点数据,head结点没有数据,从第1个结点开始才有数据
while (L != NULL) {
printf("%d", L->data); //输出每个结点的数据域
L = L->next; //L后移一个结点,准备输出下一个结点的数据域
}
*/
/*
insert(L, 3, 4); //在链表L的第3个位置上插入元素4,L:5 3 4 6 1 2
L = L->next; //L后移一个结点准备输出结点数据,head结点没有数据,从第1个结点开始才有数据
while (L != NULL) {
printf("%d", L->data); //输出每个结点的数据域
L = L->next; //L后移一个结点,准备输出下一个结点的数据域
}
*/
del(L, 6); //删除链表L中的6,L:5 3 1 2
L = L->next; //L后移一个结点准备输出结点数据,head结点没有数据,从第1个结点开始才有数据
while (L != NULL) {
printf("%d", L->data); //输出每个结点的数据域
L = L->next; //L后移一个结点,准备输出下一个结点的数据域
}
return 0;
}