我建立的循环链表删除操作出现错误!请大神就错~
//线性表的链式结构(改装成为循环链表)#include<stdio.h>
#include<stdlib.h>
typedef struct Link_Node_ LinkNode;
struct Link_Node_ //结点的公共部分
{
LinkNode* next;
};
typedef struct Link_Array_ //动态链表的头结点,包含第一个结点的地址
{
LinkNode header;
int length;
}LinkArray;
LinkArray* CreatLink() //创建线性链表
{
LinkArray* ret=(LinkArray*)malloc(sizeof(LinkArray));
if(ret!=NULL)
{
ret->header.next=NULL;
ret->length=0;
puts("成功");
}
return ret;
}
void DestoryLink(LinkArray*link) //摧毁线性链表
{
free(link);
}
void ClearLink(LinkArray*link) //清空线性链表
{
LinkArray*slink=link;
if(slink!=NULL)
{
slink->header.next=NULL;
slink->length=0;
}
}
int LengthLink(LinkArray*link) //输出链表长度
{
LinkArray*slink=link;
if(slink!=NULL)
{
// printf("%d\n",slink->length); //验证代码!
return slink->length;
}
}
void InsertLink(LinkArray*link,LinkNode*member,int pos) //链表中插入元素
{
LinkArray* slink=link;
int ret;
int i;
ret=(slink!=0)&&(pos>=0)&&(member!=NULL);
if(ret)
{
LinkNode* current=(LinkNode*)slink;
for(i=0;(i<pos)&&(current->next!=NULL);i++) //Amos此处你出错一次晓得不撒!
{
current=current->next;
}
member->next=current->next;
current->next=member;
if(slink->length==0)
{
member->next=member;
}
else if(pos==0)
{
for(i=0;i<slink->length;i++)
current=current->next;
current->next->next=member;
}
slink->length++;
}
}
LinkNode* GetLink(LinkArray*link,int pos)
{
LinkArray* slink=link;
int i;
int ret;
LinkNode* rat;
ret=(pos>=0)&&(slink!=NULL); //注意下标号和查询序列的区别
if(ret)
{
LinkNode* current=(LinkNode*)slink;
for(i=0;i<pos;i++)
current=current->next;
rat=current->next;
return rat;
}
}
void DeleteLink(LinkArray*link,int pos)
{
LinkArray* slink=link;
LinkNode* first=NULL;
LinkNode* last=NULL;
LinkNode* current=(LinkNode*)slink;
int i;
int ret;
first=slink->header.next;
for(i=0;i<slink->length;i++)
current=current->next;
last=current->next;
ret=(slink!=NULL)&&(pos>=0)&&(pos<slink->length);
if(ret)
{
current=(LinkNode*)slink; //此处强制类型转换使得指针由LinkArray类型指向更改为LinkNode类型,
for(i=0;i<pos;i++) //主要原因为因为该链表结构为LinkArray->LinkNode->LinkNode-> ...
{ //所以我们需要保证指针每次的偏移量为LinkNode的长度。
current=current->next;
}
current->next=current->next->next; //注意此类赋值表达式左右表示的不同,坐标表示元素中的next指针,右边表示元素单元
if(current->next==first) 问题:当删除元素为第一个元素时,更换表头指向,但是输出结果却不对!
{
slink->header.next=current->next->next;
}
slink->length--;
}
}
typedef struct Value //一般数据结点内容
{
LinkNode header;
int v;
}Tmember;
void PrintLink(LinkArray*p)
{
int i;
for(i=0;i<p->length*2;i++) //将此输出也以函数实现!
{
struct Value* pv=(struct Value*)GetLink(p,i);
printf("%d ",pv->v);
}
putchar('\n');
}
int main()
{
LinkArray* p=NULL;
Tmember v1,v2,v3,v4,v5;
p=CreatLink();
v1.v=1;
v2.v=2;
v3.v=3;
v4.v=4;
v5.v=5;
InsertLink(p,(LinkNode*)&v1,0);
InsertLink(p,(LinkNode*)&v2,0);
InsertLink(p,(LinkNode*)&v3,0);
InsertLink(p,(LinkNode*)&v4,0);
InsertLink(p,(LinkNode*)&v5,0);
PrintLink(p);
DeleteLink(p,0);
PrintLink(p);
return 0;
}
//问题: 问题:当删除元素为第一个元素时,更换表头指向,但是输出结果却不对!