#include "Linklist.h"
#include <stdlib.h>
#include <stdio.h>
//创建链表
List *CreateList()
{
//给List(头结点)分配空间
List *ls = (List *)malloc(sizeof(List)/sizeof(char));
if (NULL == ls)
return NULL;
//给Node(结点·)分配空间
ls->head = (Node *)malloc(sizeof(Node)/sizeof(char));
if (NULL == ls->head)
{
free(ls);
return NULL;
}
ls->head->next = ls->head;
return ls;
}
//销毁链表
void Distory(List *ls)
{
if (NULL == ls)
return ;
Node *tmp = ls->head;
while(tmp->next != ls->head)
{
Node *p = tmp->next;
tmp->next = p->next;
free(p);
}
free(ls->head);
free(ls);
}
//头插
BOOL Insert_Head (List *ls,Data data)
{
if(NULL == ls)
return ERROR;
Node *node = (Node *)malloc(sizeof(node)/sizeof(char));
if (NULL == node)
return ERROR;
node->data = data;
node->next = ls->head->next;
ls->head->next = node;
return TRUE;
}
//尾插
BOOL Insert_Last (List *ls,Data data)
{
if (NULL == ls)
return ERROR;
Node *node = (Node *)malloc(sizeof(node)/sizeof(char));
if (NULL == node)
return ERROR;
Node *tmp = ls->head;
while(tmp->next != ls->head)
{
tmp = tmp->next;
}
tmp->next = node;
node->data = data;
node->next = ls->head;
return TRUE;
}
//在pos位置插入
BOOL Insert_Pos (List *ls, int pos, Data data)
{
if (NULL == ls)
return ERROR;
int i ;
Node *tmp = ls->head;
for(i = 0 ; i < (pos-1) ; i++)
{
tmp = tmp->next;
if(ls->head == tmp) //检测是否越界
{
printf ("长度越界 %d\n",i);
return ERROR;
}
}
//创建新结点
Node *node = (Node *)malloc(sizeof(node)/sizeof(char));
if (NULL == node)
return ERROR;
//插入
node->data = data;
node->next = tmp->next;
tmp->next = node;
}
//删除第pos位
BOOL Delete_Pos (List *ls, int pos)
{
if (NULL == ls)
return ERROR;
int i ;
Node *tmp = ls->head;
for(i = 0 ; i < (pos-1) ; i++)
{
tmp = tmp->next;
if(ls->head == tmp || ls->head == tmp->next) //检测是否越界
{
printf ("长度越界 %d\n",i);
return ERROR;
}
}
Node *p = tmp->next;
tmp->next = p->next;
free(p);
return TRUE;
}
//根据数据删除
BOOL Delete_Data (List *ls, Data data)
{
if (NULL == ls)
return ERROR;
Node *tmp = ls->head;
while (tmp->next != ls->head)
{
if(tmp->next->data == data)
{
Node *p = tmp->next;
tmp->next = p->next;
free(p);
return TRUE;
}
tmp = tmp->next;
}
return FALSE;
}
//链表逆序
BOOL Reverse (List *ls)
{
//NULL == ls || NULL == ls->head 链表不存在
//NULL == ls->head->next 空链表
// NULL == ls->head->next->next 只有一个结点的链表
if(NULL == ls || NULL == ls->head || ls->head == ls->head->next || ls->head == ls->head->next->next)
return ERROR;
Node *pre = ls->head->next; //第一个结点
Node *cur = pre->next; //第二个结点
Node *tmp; //保存当前结点的下一个结点
while (cur != ls->head)
{
tmp = cur->next; //核
cur->next = pre; //心
pre = cur; //代
cur = tmp; //码
}
ls->head->next->next = ls->head;
ls->head->next = pre;
return TRUE;
}
//打印
void Display(List *ls)
{
Node *tmp = ls->head->next;
while(tmp != ls->head)
{
printf ("%-4d",tmp->data);
tmp = tmp->next;
}
printf ("\n");
}
//倒数第K个值
Data CountBackwards(List *ls,int k)
{
if (NULL == ls)
return NULL;
Node *tmp = ls->head;
int i;
for (i = 0; i < k; i++)
{
tmp = tmp->next;
if(NULL == tmp)
{
printf("长度越界\n");
return;
}
}
Node *p1 = ls->head;
Node *p2 = ls->head;
for(i = 0; i < k-1; i++)
{
p1 = p1->next;
}
while(p1->next)
{
p1 = p1->next;
p2 = p2->next;
}
return p2->data;
}
//中间数的值
//Data Middle(List *ls)