编译器: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;
}
运行结果: