#include <stdio.h>
#include <stdlib.h>
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 10
#define initsize 10
typedef struct LNode{ //单链表的建立
int data; //数据域
struct LNode *next; //指针域
}LNode;
typedef struct LNode *LinkList; //强调的是单链表
bool InitList1(LinkList &L) //不带头节点
{
L=NULL;
return true;
}
bool InitList(LinkList &L) //带头节点
{
L=(LNode *)malloc(sizeof(LNode));
if(L==NULL)
return false;
L->next=NULL;
cout<<"初始化成功"<<endl;
return true;
}
bool empty(LinkList L) //单链表是否为空
{
if(L==NULL)
return true;
else
return false;
}
bool ListInsert(LinkList &L,int i,int e) //单链表插入操作,在第i个位置插入指定元素e
{
if(i<1)
{
return false; //超出范围
}
LNode *p;
p=L; //指向头结点,头结点是第0个节点(不存数据)
LNode *s=(LNode *)malloc(sizeof(LNode));//申请新节点
s->data=e;
int j=0;
while(p!=NULL&& j<i-1)
{
p=p->next;
j++;
}
s->next=p->next; //插入前后两个节点之间
p->next=s;
cout<<"插入成功"<<endl;
}
bool InsertNextNode(LNode *p,int e) //在当前节点后插入元素e
{
if(p==NULL)
{
return false;
}
LNode *s=(LNode *)malloc(sizeof(LNode));//申请新节点
s->data=e;
s->next=p->next;
p->next=s;
cout<<"后插成功"<<endl;
return true;
}
bool InsertPriorNode(LNode *p,int e) //在当前节点前插入元素e,采用将节点数据互换的方法以替代传入头结点遍历
{
if(p==NULL)
{
return false;
}
LNode *s=(LNode *)malloc(sizeof(LNode));//申请新节点
s->data=p->data; //新节点复制原来节点的值
p->data=e; //原来节点变成“前插节点”
s->next=p->next; //连接节点
p->next=s;
cout<<"前插成功"<<endl;
return true;
}
bool ListDelete(LinkList &L,int i,int &e) //删除指定的第i个节点,返回删除节点的数据
{
if(i<1)
return false;
LNode *p;
p=L;
int j=0;
while(p!=NULL&&j<i-1) //循环找到第i-1个节点,即第i个节点的前驱节点
{
p=p->next;
j++;
if(p==NULL)
{
cout<<"error!空指针!"<<endl;
return false;
}
}
if(p==NULL||p->next==NULL)
{
cout<<"error!空指针!"<<endl;
return false;
}
cout<<"删除中"<<endl;
e=p->next->data;
p->next=p->next->next;
//free(p->next);
cout<<"删除成功"<<endl;
return true;
}
bool DeleteNode(LNode *p) //删除当前节点 (同样无法找到前驱指针采用数据互换的方法)
{
if(p==NULL)
return false;
LNode *s=p->next;
p->data=s->data;
p->next=s->next;
free(s);
cout<<"删除当前节点成功"<<endl;
return true;
}
LNode * GetElem(LinkList L,int i) //按位查找,返回第i个节点
{
if(i<0)
return NULL;
LNode *p;
p=L;
int j=0;
while(p!=NULL&&j<i) //循环找到第i个节点
{
p=p->next;
j++;
}
cout<<"按位查找节点成功"<<endl;
return p;
}
LNode * LocateElem(LinkList L,int e) //按值查找,返回与索引值相等的节点
{
LNode *p;
p=L;
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
return p;
}
int Length(LinkList L)
{
int len=0;
LNode *p=L;
while(p->next!=NULL)
{
p=p->next;
len++;
}
return len;
}
main()
{
int e;
LinkList L;
InitList(L);
InsertNextNode(L,2);
InsertPriorNode(L,1);
ListInsert(L,3,3);
ListInsert(L,4,4);
ListInsert(L,5,5);
ListDelete(L,5,e);
cout<<e<<endl;
e=Length(L);
cout<<e<<endl;
LNode * s=LocateElem(L,5);
}
数据结构-2.2单链表
最新推荐文章于 2024-07-11 15:49:26 发布