单链表的简单操作!!有错!求帮忙!
#include<stdio.h>#include<stdlib.h>
#include<malloc.h>
//Status 为函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;
// ElemType为数据元素类型,根据实际情况而定,这里假设为int
typedef int ElemType;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define num 10
struct LNode /* 结点定义 */
{
int data;
struct LNode *next;
};
struct LNode *creatlink();
Status ListLength(struct LNode *h); //(1)求表的长度函数
Status GetElem(struct LNode *L,int i,ElemType *e); //(2)取表中的一个元素函数GetElem( L,i,&e)
void ListInsert(struct LNode *L,int i,ElemType e); //(4)在表中插入一个元素函数 ListInsert(&L,i,e)
Status ListEmpty(struct LNode *L); //(5)判断表是否空函数ListEmpty(L)
void ListDelet(struct LNode *L,int i,ElemType *e); //(6)删除表中数据函数ListDelete(&L,i,&e)
void print(struct LNode *h);
int main()
{
int n, e=0,s,i;
struct LNode *LinkList; /* 表的头指针类型 */
printf("\n创建链表为: \n");
LinkList=creatlink();
print(LinkList);
n=ListLength(LinkList);
printf("\n链表的长度:%d\n",n);
printf("\n取表中的一个数:");
scanf("%d",&i);
s=GetElem(LinkList,i,&e);
if(s==1)
printf("\n存在 ");
else
printf("\n不存在 : ");
ListInsert(&LinkList,i,e);
print(LinkList);
ListDelet(&LinkList,i,&e);
print(LinkList);
s=ListEmpty(LinkList);
printf("\n空表即是1,不是空表即是0 : %d\n",s);
printf("\n");
print(LinkList);
return 0;
}
struct LNode *creatlink()
{
int n;
struct LNode *p,*q,*h;
h=p=q=(struct LNode *)malloc(sizeof(struct LNode));
h=NULL;
for(n=0 ; n<num ; n++)
{
if(n == 0)
{
p->data=n;
h=p;
}
else
q->next=p;
q=p;
p=(struct LNode *)malloc(sizeof(struct LNode));
p->data=n+1;
}
q->next =NULL;
return h;
}
Status ListLength(struct LNode *h) // 1
{
int n=0;
while(h!=NULL)
{
n++;
h = h -> next;
}
return n;
}
void print(struct LNode *h)
{
while(h!=NULL)
{
printf("%d —> ",h->data);
h = h -> next;
}
puts("NULL");
}
Status GetElem(struct LNode *L,int i,ElemType *e) // 2
{
/* L为单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
int j=1; /* j为计数器 */
struct LNode *p=L; /* p指向第一个结点 */
while(p&&j<i) /* 顺指针向后查找, 直到p指向第i个元素 或p为空 */
{
p=p->next;
j++;
}
if(!p||j>i) /* 第i个元素不存在 */
return ERROR;
*e=p->data; /* 取第i个元素 */
return OK;
}
Status ListEmpty(struct LNode *L) //5
{ /* 初始条件:链式存储的表L已存在。*/
/*操作结果:若L为空表,则返回TRUE,否则返回FALSE */
if(L->next)
return FALSE;
else
return TRUE;
}
//Status LocateElemLocateElem(struct LNode *L,ElemType *e,compare( ));
void ListInsert(struct LNode *L,int i,ElemType e) //4
{
int m=0;
struct LNode *p,*q;
p=(struct LNode *)malloc(sizeof(struct LNode));
p->data = e;
q=L;
while( m < i )
{
q=q->next;
m++;
}
p->next=p->next ;
q->next = p;
}
void ListDelet(struct LNode *L,int i,ElemType *e) //6 删除L的第i个数据元素,并用e返回其值,
{
int m=0;
struct LNode *p,*q;
p=L;
while( m < i )
{
q=p;
p=p->next;
m++;
}
*e=p->data;
q->next=p->next ;
free(p);
}