带头结点的单链表
/*
功能:创建一个空链表
参数:无
返回值:
失败返回NULL
成功返回头结点的地址
*/
List * createLkList()
{
List * list = (List *)malloc(sizeof(List));
if(list == NULL)
{
printf("malloc fail\n");
return NULL;//失败返回NULL
}
list->first = NULL;
list->last = NULL;
list->n = 0;//现在还是空链表
return list;
}
/*
功能:往链表中插入一个元素
参数:
@list 头结点的地址
@x 待插入的数据
返回值:无
*/
void insert(List * list,ElemType x)
{
//1,分配空间
Node * p = (Node *)malloc(sizeof(Node));
//2,保存数据
p->data = x;
p->next = NULL;
//3,把该节点插入到链表中
if(list->first == NULL)//if(list->n == n)
{
list->first = p;
list->last = p;
}
else
{
#if 0
//尾插法
list->last->next = p;
list->last = p;
#else
//头插法
p->next = list->first;
list->first = p;
#endif
}
list->n ++;
}
void printfLkList(List * l)
{
Node * p = l->first;
#if 0
while(p)
{
printf("%d ",p->data);
p = p->next;
}
#else
int i;
for(i=0;i<l->n;i++)
{
printf("%d ",p->data);
p = p->next;
}
#endif
printf("\n");
}
void cleanList(List *list)
{
Node * p = list->first;
Node * q = NULL;
while(p)
{
q = p->next;
p->next = NULL;
free(p);
p = q;
}
list->first=list->last=NULL;
list->n = 0;
}
void destroyList(List * list)
{
cleanList(list);
free(list);
}
int find(List * list,ElemType x)
{
Node * p = list->first;
while(p)
{
if(p->data == x)
{
return 1;
}
p = p->next;
}
return 0;
}
//有序
void insertElem(List * list,ElemType x)
{
Node * p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = NULL;
Node * q = list->first;
Node * r = NULL;
while(q)
{
if(q->data > x)
{
break;
}
r = q;
q = q->next;
}
if(q == NULL)//没找到
{
r->next = p;
p->next = NULL;
list->last = p;
}
else if(q == list->first)//第一个就比我大
{
p->next = list->first;
list->first = p;
}
else//中间位置
{
r->next = p;
p->next = q;
}
list->n ++;
}
void delete(List * list,ElemType x)
{
Node * p = list->first;
Node * r = NULL;
while(p)
{
if(p->data == x)
{
break;
}
r = p;
p = p->next;
}
if(p != NULL)//找到了
{
//分情况删除
if(p == list->first)//删除的是第一个
{
list->first = p->next;
p->next = NULL;
free(p);
}
else if(p == list->last)//删除的是最后一个
{
list->last = r;
r->next = NULL;
p->next = NULL;
free(p);
}
else//中间
{
r->next = p->next;
p->next = NULL;
free(p);
}
list->n --;
}
}