【数据结构学习】线性表(链式结构-单链表-头插法)C/C++代码

编译器:DevC++5.11

/*
数据结构与算法【线性表 (链式结构-单链表) C/C++代码】 基于《大话数据结构》
参考了网上一些资料+自己的一些理解,不喜勿喷 
*/
#include <bits/stdc++.h> //C++万用表头 
#define ElemType int    //线性表元素类型抽象定义 ,这里默认为 int 
using namespace std;

//1.自定义结构体结点(Node)
struct Node{
	ElemType data; //数据域 
	Node* next;   //指针域 
};

//2.创建链表表头 (头结点) 
Node* CreateList(){
	Node* headNode = new Node; 
	if(headNode != NULL)
		headNode->next = NULL; //头结点的指针域需要初始化,数据域不需要 
	return headNode;
}

//3.创建链表结点 (为插入结点函数的子函数)
Node* CreateNode(ElemType e){
	Node* newNode = new Node;
	if(newNode != NULL){
		newNode->data = e;
		newNode->next = NULL;
	}
	return newNode;
} 


//4.插入链表结点(头插法) 函数参数(要插入的链表,插入结点的数据域元素) 
void InsertNodeByhead(Node* headNode,ElemType e){
	Node* newNode  = CreateNode(e); //先创建要插入的结点
	newNode->next  = headNode->next; //接前驱,连后继,不能反过来 
	headNode->next = newNode; 
} 

//5.删除链表结点(指定删除) 函数参数(要删除结点的链表,要删除的指定的数据域元素) 
/*思路:从头开始,只要链表没遍历完,就按指定要求一直找 
        如果找到了,就让指定结点的前一个结点连上后一个结点 
*/
void DeleteNodeByPoint(Node* headNode,ElemType e){
	Node* posNode = headNode->next;
	Node* posNodefront = headNode;
	if(posNode == NULL)
		printf("链表为空,不能删除!");
	else{
		while(posNode->data != e){
			posNodefront = posNode;
			posNode = posNodefront->next;
			if(posNode->next == NULL){
				printf("链表已经遍历完"); 
				break;
			}
		}
		posNodefront->next = posNode->next;
		delete posNode;
	}
} 

//6.打印链表
//思路:从第一个结点开始打印,只要不是最后一个结点,就一直打印下去 
void ShowList(Node* headNode){
	Node* pMove = headNode->next;
	printf("链表元素如下(逆序):\n");
	while(pMove != NULL){
		printf("%d\t",pMove->data); 
		pMove = pMove->next;
	}
} 

int main(){
	int n;
	Node* list = CreateList();
	ElemType* data = new ElemType[n];  
	printf("输入元素个数:");
	cin >> n;
	printf("输入链表元素:");
	for(int i = 0;i < n;i++)
		cin >> data[i];
	for(int i = 0;i < n;i++)
		InsertNodeByhead(list,data[i]);
	printf("删除元素前\n"); 
	ShowList(list);
	ElemType e;
	printf("\n请输入要删除的元素:");
	cin >> e;
	DeleteNodeByPoint(list,e);
	printf("删除元素后\n");
	ShowList(list); 
	delete[] data;
	return 0;
}

运行结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roy1Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值