#include<iostream>
using namespace std;
//单链表
typedef struct LNode
{
int data;//不加*号
struct LNode *next;//不是int *next,而是定义一个LNode*类型的指针域;
}LNode,*LinkList;
//头插法
LinkList List_HeadInsert(LinkList &L)
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode)); //一个结点大小的LinkList链表的头结点
L->next=NULL; //初始为空链表
cin>>x;
while (x!=9999) //直到输入终止字符为止,9999表示结束
{
//先申请结点空间
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
cin>>x; //输入下一个结点值
}
cout<<"touchawancheng"<<endl;
return L; //返回链表L
}
//尾插法
LinkList List_EndInsert(LinkList &L)
{
LNode *s,*r; //r表尾指针
int x;
L=(LinkList)malloc(sizeof(LNode));
cin>>x;
while (x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
cin>>x;
}
r->next=NULL;
return L;
}
//不带头节点创建
LinkList List_Creat(LinkList &L)
{
LNode *r,*s; //插入结点指针s,尾指针r
int x;
cin>>x;
L=(LinkList)malloc(sizeof(LNode));//头结点存储数据
L->data=x;
r=L;
while (x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
cin>>x;
}
r->next=NULL;
return L;
}
//不带头结点初始化
// bool InitList(LinkList &L)
// {
// L=NULL; //L数据尾空即可,防止脏数据
// return true;
// }
//带头结点初始化
bool InitList(LinkList &L)
{
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)return false; //内存不足,分配失败
L->next=NULL;
cout<<"yichushihua"<<endl;
return true;
}
//带头结点判断是否为空
bool empty(LinkList &L)
{
if(L->next==NULL)
return true;
else
{
return false;
}
}
//前插操作法一,前插,所以要找前驱结点,因为要查找结点,所以时O(n)的时间复杂度
bool ListPriorNode1(LinkList &L,int i,int e)
{
if(i<1)return NULL;
LNode *p,*s;
int j=0;
p=L;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
while(p&&j<i-1)
{
j++;
p=p->next;
}
if(p==NULL)return false;//i位置不合法
s->next=p->next;
p->next=s;
cout<<"charuwancheng"<<endl;
return true;
}
//前插操作法二,时间复杂度O(1),传入的是一个结点,所以复杂度为1,不用遍历,用查找算法展现找到结点,再插入
bool InsertPriorNode2(LNode *p, int e)
{
if(p==NULL)return false; //插入位置非法
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)return false; //内存不足
s->next=p->next;
p->next=s; //后插s
s->data=p->data; //交换p和s结点的data
p->data=e;
return true;
}
//后插操作,时间复杂度O(n)
bool ListInsert(LinkList &L,int i, int e)
{
if(i<1)return NULL;
LNode *p,*s;
int j=1;
p=L->next;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
while(p&&j<i)
{
j++;
p=p->next;
}
if(p==NULL)return false;//i位置不合法
s->next=p->next;
p->next=s;
cout<<"houchachenggong"<<endl;
return true;
}
//删除结点
bool ListDelete(LinkList &L,int i,int e)
{
if (i<1)
{
return false;
}
LNode *p=L;
int j=0;
while (p&&j<i-1)
{
j++;
p=p->next;
}
if(p==NULL||p->next==NULL)return false; //p非法,或p是尾结点
LNode *q=p->next;
e=q->data;
p->next=q->next;
free(q); //释放结点空间,malloc需要free
return true;
}
//求表长
int Length(LinkList L)
{
int j=0;
LNode *p=L;
while (p!=NULL)
{
j++;
p=p->next;
}
return j-1;
}
//按序号查找结点值
LNode *Getelem(LinkList L,int i)
{
int j=1;
LNode *p=L->next;
if(i<0)return NULL; //i无效,返回NULL
if(i==0)return L; //i=0返回头结点
while (p&&j<i) //用p存在来判定是否超出L的长度
{
j++;
p=p->next;
}
return p; //返回第i个结点的指针,若i大于表长则p==NuLL,也就返回BULL
}
//按值查找
LNode *LocateElem(LinkList L,int e)
{
LNode *p=L->next;
while (p&&p->data!=e)
{
p=p->next;
}
return p;
}
//打印链表
LinkList Print(LinkList L)
{
LNode *p=L->next;
while (p)
{
cout<<p->data<<" ";
p=p->next;
}
return L;
}
int main()
{
LinkList L;
InitList(L);
List_HeadInsert(L);
cout<<Length(L)<<endl;
//前插10
ListPriorNode1(L,1,10);
//后插5
ListInsert(L,1,5);
//删除第三个结点
int r;
cout<<ListDelete(L,3,r)<<endl;
Print(L);
//查找3
cout<<Getelem(L,3);
//在第一个位置前插3
LNode *p=Getelem(L,3);
InsertPriorNode2(p,60);
Print(L);
}
C++单链表操作(增删查改)
最新推荐文章于 2023-02-25 20:47:57 发布