问题:
单链表的各种插入和删除操作。
思路:
(1)按位插入(带头结点):
代码如下:
bool listinsert(linklist &l,int i,int e)
{
if(i<1)
{
return false;
}
//找出第i-1的结点
lnode* p;
p=l;
int j=0;//表示p所指向的结点
while(p!=NULL && jnext; //每次循环,p结点从头结点,往后移1位。
j++;
}
//创建新节点,进行连接
if(p==NULL)
return false;
lnode* s=(lnode*)malloc(sizeof(lnode));
s->data=e;//数据域赋值
s->next=p->next;
p->next=s;
return true;
}
(2)按位插入(不带头结点)
代码如下:
bool notouinsert(linklist &l,int i,int e)//无头结点 插入
{
if(i==1)
{
lnode *s=(lnode*)malloc(sizeof(lnode));
s->data=e;
s->next=l;
l=s; //头指针,指向s ,这里l为头指针,没头结点
return true;
}
lnode *p=l;
int j=1;
while(p!=NULL&&jnext;
j++;
}
if(p==NULL)
return false;
lnode *s=(lnode*)malloc(sizeof(lnode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
(3)指定结点后插操作
代码如下:
bool houcha(lnode *p,int e) //后插操作
{
lnode *s=(lnode*)malloc(sizeof(lnode));//由于直接可以在该节点后插入,所以直接给结点赋值扩展空间
if(s==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
有了这个后插操作函数,下次写按位插入时,最后一步可以直接写该函数。
如这样:
bool insertlist(linklist &l,int i,int e)//带头结点 插入
{
if(i<1)
return false;
lnode* p;
p=l;
int j=0;
while(p!=NULL && jnext;
j++;
}
houcha(p,e);
return true;
}
(4)指定节点——前插操作
代码如下:
bool charu(lnode *p,lnode *s)
{
if(p==NULL ||s==NULL)
return false;
s->next=p->next;
p->next=s;
int temp =p->data;
p->data=s->data;
s->data=temp;
return true;
}
(5)按位序删除结点(带头结点)
代码如下:
bool wei_delete(linklist &l,int i,int &e)//因为e的值需要带回主函数去,所以加个&符号
{
if(i<1)
return false;
//找第i-1个结点
lnode* p=l;
int j=0;
while(p!=NULL&&jnext;
j++;
}
//进行排错
if(p==NULL) //p结点若不存在,则i的位置不对
return false;
if(p->next=NULL)//p结点后为结点,则没有要删除的结点
return false;
lnode *q=p->next;//q指向p结点的后继结点,即需要删除的结点
e=q->data; //给删除节点中的数值,赋值给e
p->next=q->next;//直接把p结点连接到q结点的后继,绕过删除节点,相当于从单链表中剔除掉
free(q); //释放q结点
return true;
}
(6)按位查找
代码如下:
lnode * getlist(linklist l,int i) //我所查找该位置的结点
{
if(i<0) //第0个结点为头结点,如果比头结点还靠前,则肯定不对,返回false
return false;
lnode *p; //定义结点指针p指向所需返回的结点
p=l; //让p初试位置为头结点处
int j=0;
while(p!=NULL && jnext;
j++;
}
return p;
}
这个就类似于之前按位插入中的查找第i-1个结点的操作,因此可以替换成如下:
bool insertlist(linklist &l,int i,int e)//带头结点 插入
{
if(i<1)
return false;
lnode* p;
p=getlist(l,i-1);//查找第i-1个结点,然后返回该节点,给p
houcha(p,e);
return true;
}
删除操作中也有
bool wei_delete(linklist &l,int i,int &e)//因为e的值需要带回主函数去,所以加个&符号
{
if(i<1)
return false;
lnode* p;
p=getlist(l,i-1);
if(p==NULL)
return false;
if(p->next=NULL)
return false;
lnode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
(7)按值查找
代码如下:
lnode *getzhi(linklist &l,int e)
{
lnode *p=l->next;//直接指向头结点的后继结点,即实际第一个结点
if(p==NULL)
return false;
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
return p;
}
(8)求链表长度
代码如下:
int lengthlist(linklist &l)
{
lnode *p=l;//掐头去尾,去中间,从头结点开始算
int len=0;
while(p!=NULL&&p->next!=NULL)//扫描到链尾为止
{
p=p->next;
len++;
}
return len;
}