单循环链表问题,帮忙看一下,可以说一下调试过程更好
#include<stdio.h>#include<stdlib.h>
typedef int ElemTyp;
typedef struct Lnode
{
ElemTyp data;
struct Lnode *next;
}Lnode;
typedef Lnode * List;
List InitList()
{//初始化链表
List L;
L=(List)malloc(sizeof(Lnode));
if(!L)
exit(-1);
L->next=L;
return L;
}
void ClearList(List L)
{//清空链表
List q,p;
L=L->next;
p=L->next;
while(p!=L)
{
q=p->next;
free(p);
p=q;
}
L->next=L;
}
bool EmptyList(List L)
{//判断链表是否为空
if(L==L->next)
return true;
else
return false;
}
int ListLength(List L)
{//计算链表的长度
int i=0;
List q;
q=L->next;
while(q!=L)
{
++i;
q=q->next;
}
return i;
}
bool InsertElemTyp(List L,int i,ElemTyp e)
{//插入节点,在第i个元素前;
List q,s;
int j;
if(i<=0||i>ListLength(L)+1)
return false;
// if(i==ListLength(*L)+1)
q=L->next;
for(j=0;j<i-1;j++)
q=q->next;
s=(List)malloc(sizeof(Lnode));
s->data=e;
s->next=q->next;
q->next=s;
if(q==L)
L=s;
return true;
}
bool DeleteElemTyp(List L,int i,ElemTyp *e)
{//删除第i个节点,并用e返回
List q,p;
int j;
if(i<1||i>ListLength(L))
return false;
q=L->next;
for(j=0;j<i-1;j++)
q=q->next;
p=q->next;//p为释放节点
q->next=p->next;
*e=p->data;
if(i==ListLength(L))
L=q;
free(p);
return true;
}
//bool SearchElemTyp(List L,int i,ElemTyp *e)
void TraverseList(List L)
{//遍历链表
List q;
q=L->next;
while(q!=L)
{
q=q->next;
printf("%d ",q->data);
}
printf("\n");
}
int main()
{
ElemTyp e;
List L;
L=InitList();
InsertElemTyp(L,1,10);
InsertElemTyp(L,1,15);
/* InsertElemTyp(L,1,14);
InsertElemTyp(L,1,13);
InsertElemTyp(L,1,12);*/
TraverseList(L);
printf("链表的长度是:%d\n",ListLength(L));
/* DeleteElemTyp(L,5,&e);
printf("删除的元素是:%d\n",e);
printf("链表的长度是:%d\n",ListLength(L));*/
return 0;
}