#include "linklist.h"
#include <stdlib.h>
#include <stdio.h>
//创建头节点
lkl_pnode create_linklist()
{
//创建堆区空间
lkl_pnode H = (lkl_pnode)malloc(sizeof(lkl_node));
if(NULL == H)
{
printf("malloc is default\n");
return NULL;
}
H->next = NULL; //一开始是没有其他节点的,所以头节点指向NULL
return H;
}
//获取链表长度
int getlen_linklist(lkl_pnode H)
{
int count = 0;
while(H->next)
{
H = H->next;
count++;
}
return count;
}
//插入
int insert_linklist(lkl_pnode H, int pos, linklist_data_t data)
{
//判断插入位置是否合法
if(pos < 0 || pos > getlen_linklist(H))
{
printf("pos is default\n");
return -1;
}
//找到插入位置的前一个节点的位置
while(pos--)
{
H = H->next;
}
//插入,头插
lkl_pnode new = create_linklist();
new->data = data;
new->next = H->next;
H->next = new;
return 0;
}
//判空
int empty_linklist(lkl_pnode H)
{
if(H->next == NULL)
return 0;
else
return -1;
}
//打印
int show_linklist(lkl_pnode H)
{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
//遍历
while(H->next)
{
H = H->next;
printf("dat=%d ", H->data);
}
printf("\n");
}
//删除
int delete_linklist(lkl_pnode H, linklist_data_t data)
//按值删除
{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
//找到要删除的数值位置
while(H->next)
{if(H->next->data==data)
break;
H = H->next;
}
//保存要删除的节点的位置
lkl_pnode p = H->next;
//连线
H->next = p->next;
//释放空间
free(p);
p = NULL;
return 0;
}
int delete1_linklist(lkl_pnode H, int pos);//按位置删除
/*{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
if(pos < 0 || pos >= getlen_linklist(H))
{
printf("pos is default\n");
return -1;
}
//找到要删除的前一个节点位置
while(pos--)
{
H = H->next;
}
//保存要删除的节点的位置
lkl_pnode p = H->next;
//连线
H->next = p->next;
//释放空间
free(p);
p = NULL;
return 0;
}*/
//查询
linklist_data_t search_linklist(lkl_pnode H, int pos); //按位置查询值
/*{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
if(pos < 0 || pos >= getlen_linklist(H))
{
printf("pos is default\n");
return -1;
}
while(pos--)
{
H = H->next;
}
return H->next->data;
}*/
int search1_linklist(lkl_pnode H, linklist_data_t data)
{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
while(H->next)
{if(H->next->data==data)
break;
H = H->next;
}
return H->next->data;
}//按值查位置
//修改
int change_linklist(lkl_pnode H, int pos, linklist_data_t data); //按位置修改值
/*{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
if(pos < 0 || pos >= getlen_linklist(H))
{
printf("pos is default\n");
return -1;
}
while(pos--)
{
H = H->next;
}
H->next->data = data;
return 0;
}*/
int change1_linklist(lkl_pnode H, linklist_data_t old_data, linklist_data_t new_data)//按值修改
{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
while(H->next)
{if(H->next->data==old_data)
break;
H = H->next;
}
H->next->data=new_data;
return H->next->data;
}
//清空
/*int clean_linklist(lkl_pnode H)
{
if(0 == empty_linklist(H))
{
printf("H is empty\n");
return -1;
}
while(empty_linklist(H))
{
delete_linklist(H,0);
}
return 0;
}
//销毁
int destroy_linklist(lkl_pnode* H)
{
if(0 == empty_linklist(*H))
{
free(*H);
*H = NULL;
}
else
{
clean_linklist(*H);
free(*H);
*H = NULL;
}
return 0;
}*/
//链表的逆序
int head_reverse(lkl_pnode H) {
lkl_pnode p=H->next;
lkl_pnode q=H->next;
H->next=NULL;
while (q!=NULL)
{
p=q;
q=q->next;
p->next=H->next;
H->next=p;
}
}
//链表的排序
int pai_linklist(lkl_pnode H)
{
lkl_pnode p=H->next;
lkl_pnode q=H->next;
lkl_pnode t=H;
H->next=NULL;
while (q!=NULL)
{
p=q;
q=q->next;
while(t->next){
if(t->next->data>p->data)
break;
else
t=t->next;
}
p->next = t->next;
t->next = p;
}
}