链表相关代码

编程入门 行业动态 更新时间:2024-10-24 07:27:40

<a href=https://www.elefans.com/category/jswz/34/1769662.html style=链表相关代码"/>

链表相关代码

NodeList.h

//
//  NodeList.hpp
//  FirstP
//
//  Created by 赫赫 on 2023/10/31.
//  链表相关代码:单链表、循环单链表、静态链表#ifndef NodeList_hpp
#define NodeList_hpp
#define MaxSize 10//定义静态链表最大长度#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;#endif /* NodeList_hpp */typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;
//LinkList L;声明一个指向单链表第一个节点的指针
//LNode *L;声明一个指针,指向单链表的第一个节点//初始化单链表(带头结点)
bool initList(LinkList &L);//初始化单链表(不带头结点)
bool initListNoHead(LinkList &L);//顺序查找第i个结点
LNode* GetElemIndex(LinkList &L,int i);//顺序查找指定结点
LNode* GetNode(LinkList &L,LNode* node);//链表插入元素
//1.按照位序插入(先顺序查找到i结点,然后在后面插入)
bool ListInsert(LinkList &L,int i,int newelem);//2.指定结点后插操作
bool InsertNextNode(LNode *p,int newelem);//3.指定结点前插操作
bool InsertPriorNode(LNode *p,int newelem);//删除元素
//1.按照指定位置删除,并记录删除位置的元素
bool DeleteNodeByIndex(LinkList &L,int i,int &elem);
//2.按照指定结点删除
bool DeleteNodeByElem(LNode *p);//获取链表长度(带头结点)
int getSize(LinkList &L);//头插法建立链表(逆序)
LinkList List_tailInsert(LinkList &L);//尾插法建立链表(正向)
LinkList List_headInsert(LinkList &L);//------------------------------------------
//创建循环单链表
bool initCycleLinkList(LinkList &L);//判断循环单链表是否为空
bool Empty(LinkList &L);//------------------------------------------
//静态链表(适用于文件分配表FAT的存储)
typedef struct{int data;int next;
}SLinkList[MaxSize];
//SLinkList L;来定义一个长度为MaxSize的静态链表

NodeList.cpp

//
//  NodeList.cpp
//  FirstP
//
//  Created by 赫赫 on 2023/10/31.
//#include "NodeList.hpp"//初始化单链表(带头结点)
bool initList(LinkList &L){L=(LNode *)malloc(sizeof(LNode));if(L==NULL){return false;}else{L->next=NULL;return true;}
}
//初始化单链表(不带头结点)
bool initListNoHead(LinkList &L){L=NULL;return true;
}//顺序查找第i个结点(带头结点)
LNode* GetElemIndex(LinkList &L,int i){int j=1;LNode *p=L->next;if(i==0){return L;}if(i<0){return NULL;}while(p!=NULL&&j<i){p=p->next;j++;}return p;
}
//顺序查找指定结点(带头结点)
LNode* GetNode(LinkList &L,LNode* node){LNode *p=L->next;while(p!=NULL&&p->data!=node->data){p=p->next;}return p;
}//链表插入元素
//1.按照位序插入,带头结点(先顺序查找到第i-1个结点,然后在后面插入)
bool ListInsert(LinkList &L,int i,int newelem){if(i<1){return false;}LNode *p=L->next;int j=1;while(p!=NULL&&j<i-1){//寻找第i个结点p=p->next;j++;}if(p==NULL){//未找到第i-1个结点return false;}else{//将新元素放在第i-1个结点后面LNode *newnode=(LNode*)malloc(sizeof(LNode));newnode->data=newelem;newnode->next=p->next;p->next=newnode;return true;}
}
//2.指定结点后插操作
bool InsertNextNode(LNode *p,int newelem){if(p==NULL){return false;}LNode *newnode=(LNode*)malloc(sizeof(LNode));if(newnode==NULL){return false;}newnode->data=newelem;newnode->next=p->next;p->next=newnode;return true;
}
//3.指定结点前插操作
//如果已知头指针,可以遍历搜索然后插入
//这里主要写一下未知头指针的情况。
bool InsertPriorNode(LNode *p,int newelem){if(p==NULL){return false;}LNode* newnode=(LNode *)malloc(sizeof(LNode));if(newnode==NULL){//内存分配失败return false;}//按照后插操作在p指针后面插入结点,然后进行数据的转移newnode->next=p->next;p->next=newnode;int temp=p->data;p->data=newnode->data;newnode->data=temp;return true;
}//删除元素
//1.按照指定位置删除,并记录删除位置的元素(带头结点)
bool DeleteNodeByIndex(LinkList &L,int i,int &elem){if(i<0){return false;}LNode *p=L->next;int j=1;while(p!=NULL&&j<i-1){//先定位到i-1的元素p=p->next;j++;}if(p==NULL){return false;}if(p->next==NULL){return false;}//删除第i个结点,也就是p->next;LNode *q=p->next;elem=q->data;p->next=q->next;free(q);//释放q指针指向的空间return true;
}//2.按照指定结点删除
//和前插法类似,若未知头结点则需要通过复制数据的方式完成删除操作
//但是当p节点是最后一个结点是,该算法没有头结点不能实现
bool DeleteNodeByElem(LNode *p){if(p==NULL){return false;}//和后继结点交换数据,指针指向后继节点的后继LNode *q=p->next;p->data=q->data;p->next=q->next;free(q);return true;
}//获取链表长度(带头结点)
int getSize(LinkList &L){int len=0;LNode *p=L->next;if(p==NULL){return len;}while(p!=NULL){len++;p=p->next;}return len;
}//头插法建立链表(逆序)
LinkList List_tailInsert(LinkList &L){int x=0;//接收输入元素//首先建立头结点L=(LinkList)malloc(sizeof(LNode));LNode *newnode,*end=L;scanf("%d",&x);while(x!=9999){//不断地往尾结点后面插入newnode=(LNode*)malloc(sizeof(LNode));newnode->data=x;end->next=newnode;end=newnode;scanf("%d",&x);}//注意下面这个语句end->next=NULL;return L;
}//尾插法建立链表(正向)
LinkList List_headInsert(LinkList &L){int x=0;//接收输入元素//首先建立头结点,并初始化L=(LinkList)malloc(sizeof(LNode));//注意下面这个语句L->next=NULL;LNode *newnode;scanf("%d",&x);while(x!=9999){//不断地往投头结点后面插入newnode=(LNode*)malloc(sizeof(LNode));newnode->data=x;newnode->next=L->next;L->next=newnode;scanf("%d",&x);}return L;
}//------------------------------------------
//创建循环单链表
bool initCycleLinkList(LinkList &L){L=(LNode*)malloc(sizeof(LNode));if(L==NULL){return false;}L->next=L;//头结点指针指向自己,表为空return true;
}//判断循环单链表是否为空
bool Empty(LinkList &L){if(L->next==L){return true;}else{return false;}
}

更多推荐

链表相关代码

本文发布于:2023-11-16 12:13:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1621043.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:链表   代码

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!