一个简单的问题,但就是不懂,求解?
#include<stdio.h>#include<malloc.h>
#define NULL 0
typedef int DataType;
typedef struct node
{
DataType data; /*每个元素数据信息*/
struct node *next; /*存放后继元素的地址*/
} LNode, *LinkList;
LinkList Creat_LinkList(void )
{ /*创建空单链表,入口参数:无;返回值:单链表的头指针,0代表创建失败,非0表成功*/
LinkList H;
H = (LinkList)malloc(sizeof(LNode));
if (H) /*确认创建头结点创建是否成功,若成功,修改单链表头结点的指针域为0表空表*/
H->next=NULL;
return H;
}
void Destroy_LinkList(LinkList H)
{ /*销毁单链表,入口参数:单链表头指针的地址,出口参数:无*/
LinkList p,q;
p=H;
while (p) /*释放单链表的所有结点*/
{
q=p;
p = p->next;
free(q);
} /*while */
H=NULL; /*将头指针变为零表示单链表不存在*/
}
int Length_LinkList (LinkList H)
{ /* 求单链表表长,入口参数:单链表头指针,出口参数:表长,-1表示单链表不存在。*/
LinkList p=H; /* p指向头结点*/
int count= -1; /*H带头结点所以从-1开始*/
while ( p) /* p所指的是第 count + 1 个结点*/
{
count++;
p=p->next;
} /*while */
return (count);
}
LinkList Locate_LinkList( LinkList H, int i)
{
LinkList p;
int j;
p=H;
j=0;
while (i>=j+1 && p!=NULL) /*查找第i个结点*/
{
p=p->next;
j++;
} /*while*/
if (!p || j>i )
{
printf("参数 i 错或单链表不存在");
return (NULL);
} /*第i个结点不存在*/
return (p);
}
int Insert_LinkList( LinkList H, int i, DataType x)
{
LinkList p, q;
p= Locate_LinkList(H, i-1); /*找第i-1个结点地址*/
if (!p)
{
printf("i有误");
return (0);
}
q=(LinkList) malloc(sizeof(LNode));
if (!q)
{
printf("申请空间失败");
return (0);
} /*申请空间失败,不能插入*/
q->data = x;
q->next = p->next; ////////////
p->next = q;
return 1; /*插入成功,则返回*/
}
int Del_LinkList(LinkList H, int i)
{ /*删除单链表H上的第i个结点;返回参数:0不成功,1成功*/
LinkList p, q;
//int j;
if (!H->next)
{
printf("空表不能删除");
return (0);
}
p= Locate_LinkList( H, i-1);
if (!p)
{
printf("参数 i 错");
return (0); /*第i个结点不存在不能删除*/
}
q = p->next;
p->next = q->next;
free(q);
return (1);
}
int Print_LinkList(LinkList H)
{
LinkList p;
p = H->next; ////////////////////////////////////////////修改的地方
while(p != NULL)
{
printf("%d ",p->data); /////////////////////////////////////////修改的地方
p = p->next; //////////////////////////////////////////修改的地方
}
printf("\n");
return 1;
}
void InvertList( LinkList L ) // 单链表逆置
{
LinkList p , q , r ;
p = L->next;
L->next = NULL;
while ( p ){
q=p->next;
p->next=L->next;
L->next =p;
p=q;
}
}
void main()
{
int n,i,x,length;
LinkList L;
LinkList t;
L=Creat_LinkList();
printf("请输入要插入的元素的个数:"); //(向单链表中插入n个元素)
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("请输入第%d个元素的值:",i);
scanf("%d",&x);
Insert_LinkList( L, i, x);
}
Print_LinkList(L); //(输出单链表中的元素)
printf("请输入要删除的元素的位置:"); //(删除单链表中i个元素)
scanf("%d",&i);
Del_LinkList(L, i);
Print_LinkList(L); //(输出单链表中的元素)
printf("请输入要查找的元素的位置:");
scanf("%d",&i);
t = Locate_LinkList( L,i);
printf("%d\n",t->data); //(查找单链表中的第i个元素)
printf("链表长度为:");
length = Length_LinkList (L);
printf("%d\n",length); //(输出单链表中的长度)
InvertList(L );
Print_LinkList(L); //(将单链表逆置,并输出逆置后单链表中的元素)
Destroy_LinkList(L); //(销毁单链表)
}
这是一个调试没有错误的代码,但是好多东西不懂,求解答!
1:为什么在长度结构体中count=-1而不是等于0?
2:在查找结构体中,j=0而不是等于0?
3:如果不要修改的结构体就出错呢?