动态链表的定义和基本操作

点击查看代码
#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;
}

posted @ 2022-09-29 21:20  zhaoo_o  阅读(30)  评论(0编辑  收藏  举报