#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<stdio.h>
using namespace std;
typedef struct LNode {
int data;
struct LNode *next;
}LNode,*LinkList;
//LNode 强调节点
//LinkList 强调链表
bool InitList(LinkList &L) {//初始化
L = (LNode*)malloc(sizeof(LNode));//分配一个头结点
if (L==NULL)//分配失败
{
return false;
}
L->next = NULL;
return true;
}
bool Empty(LinkList L) {//判空
if (L->next==NULL)
{
return true;
}
else
{
return false;
}
}
int Length(LinkList L) {//统计长度
int len = 0;
LNode* p = L;
while (p->next)
{
len++;
p = p->next;
}
return len;
}
LNode* GetElem(LinkList L, int i) {//按位查找
if (i < 0) {
return NULL;
}
int j = 0;
LNode *p = L;
while (p!=NULL&&j<i)
{
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L, int e) {//按值查找,找到数据域等于e的节点
LNode *p = L->next;
while (p!=NULL&&p->data!=e)
{
p = p->next;
}
return p;
}
bool InsertNextNode(LNode*p, int e) {//后插操作,在节点p之后插入元素e
if (p == NULL) {//没有p节点
return false;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
if (s==NULL)//内存分配失败
{
return false;
}
s->data = e;
s->next = p->next;//令新节点s的指针域指向p的后继节点
p->next = s;//令节点p的指针指向新插入的节点s
return true;
}
bool InsertPriorNode(LNode* p, int e) {//前插操作,在节点p之前插入元素e
{
if (p == NULL) {//没有p节点
return false;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)//内存分配失败
{
return false;
}
s->next = p->next;//修改指针域 把s的后继节点修改为p的后继节点
p->next = s;//令节点p的指针指向新插入的节点s
s->data == p->data;//p节点的值赋给s节点
p->data = e;//新元素赋给p节点
return true;
}
}
LinkList List_HeadInsert(LinkList &L) {//头插法建立单链表输入:1 2 3输出: 3 2 1
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));//创始头结点
L->next = NULL;//初始为空链表
cin >> x;
while (x != 9999)
{
s = (LNode*)malloc(sizeof(LNode));//创建新节点
s->data = x;
s->next = L->next;//新节点插入表中,L为头指针
L->next = s;
cin >> x;
}
return L;
}
LinkList List_TailInsert(LinkList& L) {//尾插法建立单链表
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode* s, *r = L; //r表示表尾指针
int x;
cin >> x;
while (x!=9999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; //r指向新的表尾节点
cin >> x;
}
r->next = NULL; //尾结点指针置空
return L;
}
bool ListInsert(LinkList& L,int i,int e) {//按位序插入,在第i个位置插入元素e
if (i < 1) {
return false;
}
LNode *p = GetElem(L, i - 1);
if (p == NULL) {
return false;
}
return InsertNextNode(p, e);
}
bool ListDelete(LinkList& L, int i, int& e) {//删除位序i的节点,e是i节点的值
if (i<1)
{
return false;
}
LNode*p = GetElem(L, i - 1);
if (p == NULL || (p->next) == NULL) {
return false;
}
LNode* q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
//删除指定节点P
bool DeleteNode(LNode* p) {
if (p->next == NULL) return false;
//下面这段代码有bug,不能删除最后一个节点,因此要是删除最后一个节点的话要重新进行操作
LNode* q = p->next;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
void Print(LinkList L) {
LNode *s = L;
while (s->next!=NULL)
{
s = s->next;
cout << s->data << " ";
}
cout << endl;
}
int main(){
LinkList L;
List_TailInsert(L);
cout << "尾插法:" << endl;
Print(L);
cout << "链表的第3个元素:" << GetElem(L, 3)->data << endl;
cout << "链表的长度:" << Length(L)<< endl;
int e;
ListDelete(L, 4, e);
cout << "删除的第4个元素是:" << e << endl;
cout << "当前链表:" << endl;
Print(L);
ListInsert(L, 3, e);
cout << "插入的第3个元素是:" << e << endl;
Print(L);
}
王道数据结构:带头结点的单链表基本操作
最新推荐文章于 2022-06-01 16:15:04 发布