#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "linklist.h"
//链表创建
linkptr linklist_create()
{
linkptr L = NULL;
L= (linkptr)malloc(sizeof(linknode));
if(L)
{
//创建只有头结点的空链表
L->data=0;
L->count=0;
L->next =NULL;
}
return L;
}
void linklist_show(linkptr L)
{
while(L->next != NULL)
{
printf("%d\n",L->next->data);
L=L->next;
}
}
//头部插入
int linklist_head_insert(linkptr L,data_t x)
{
linkptr p=(linkptr)malloc(sizeof(linknode));
if(p)
{
p->data = x;
p->next = L->next;
L->next = p;
L->count++;
return 0;
}else
return -1;
}
//尾部插入,要找到尾部的位置才插入,比较耗时
int linklist_back_insert(linkptr L,data_t x)
{
linkptr p = L;
while(p && p->next != NULL)
{
p=p->next;
}
linkptr q=(linkptr)malloc(sizeof(linknode));
if(q==NULL)
{
printf("q malloc null\n");
return -1;
}
q->data = x;
q->next = NULL;
p->next = q;
L->count++;
return 0;
}
//任意位置插入
int linklist_index_insert(linkptr L,data_t x,int index)
{
linkptr p,q;
if(index < 0){
printf("index <0\n");
return -1;
}else if(index==0){
p=L;
L->count++;
}else{
p =linklist_get_by_index(L,index-1);
if(p==NULL){
printf("index > length\n");
return -1;
}
q=(linkptr)malloc(sizeof(linknode));
if(q==NULL){
printf("malloc q error\n");
return -1;
}
q->data = x;
q->next = p->next;
p->next=q;
L->count++;
}
return 0;
}
//按位置查找
linkptr linklist_get_by_index(linkptr L,int index)
{
if(index < 0)
{
printf("index <0\n");
return NULL;
}
//index>=0包括两种情况,一是index在有效范围内,二是大于链表的个数
linkptr p = L;
int i=-1;
while(p->next && i<index)
{
p=p->next;
i++;
}
if(i==index){
return p;
}else{
printf("index invalid\n");
return NULL;
}
}
//按data查找
linkptr linklist_get_by_data(linkptr L,data_t x)
{
linkptr p = L->next;//从有数值的节点找起,头节点没有值跳过
while(p && p->data != x)
{
p=p->next;
}
//循环跳出有两种情况:p为空/p->data == x
return p;
}
//获取队列长度
int linklist_get_count(linkptr L)
{
if(L) return L->count;
}
//按位置删除
int linklist_delete_by_index(linkptr L,int index)
{
linkptr p,q;
if(index < 0)
{
printf("index < 0\n");
return -1;
}
if(index ==0)
{
p=L;
}else{
p = linklist_get_by_index(L,index-1);
}
if(p==NULL || p->next == NULL)//若index-1的next都为空已经指向末尾,没有可删除的元素
{
printf("index can't find\n");
return -1;
}else{
q=p->next;//用q接收要删除的节点然后释放掉
p->next = q->next;//p的next 节点指向待删除节点的下一个节点
free(q);
q=NULL;
L->count--;
return 0;
}
}
//按值删除
int linklist_delete_by_data(linkptr L,data_t x)
{
linkptr p = L->next;//从有数值的节点找起,头节点没有值跳过
linkptr pre;
while(p && p->data != x)
{
pre=p;
p=p->next;
}
if(p==NULL)
{
printf("p is null\n");
return -1;
}
if(p->next != NULL)
{
printf("find p\n");
pre->next=p->next;
}else{
printf("p is the last\n");//若是最后一个节点,把前一个节点的next置空
pre->next = NULL;
}
free(p);
p=NULL;
L->count--;
return 0;
}
//链表倒置
void linklist_reverse(linkptr L)
{
linkptr p,q;
p=L->next;//p指向头节点的下一个节点
L->next=NULL;//将原链表置空
while(p!=NULL){
q=p;
p=p->next;
q->next=L->next;
L->next =q;
}
}