LinkList.h
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
typedef enum {TRUE, FALSE, ERROR} BOOL;
typedef int Data;
typedef struct _node
{
Data data;//数据域
struct _node *next;//指针域,指向链表的下个结点
}Node;
typedef struct _list
{
Node* head;//头结点指针
}List;
//创建链表
List *CreateList();
//插入:头插
BOOL Insert_Head(List *ls, Data data);
//插入:尾插
BOOL Insert_Last(List *ls, Data data);
//根据位置插入数据
//pos:第pos个结点位置
BOOL Insert_Pos(List* ls, int pos, Data data);
//删除某个位置的数据
BOOL Delete_Pos(List* ls, int pos);
//删除某个特定数据
BOOL Delete_Data(List* ls, Data data);
//链表逆序
BOOL Reverse(List *ls);
//打印
void Display(List *ls);
//销毁链表
void Destroy(List *ls);
#endif //_LINKLIST_H_
LinkList.c
#include <stdlib.h>
#include "LinkList.h"
#include <stdio.h>
List *CreateList()
{
List *ls = (List*)malloc(sizeof(List)/sizeof(char));
if (NULL == ls)
return NULL;
//创建头结点
ls->head = (Node*)malloc(sizeof(Node)/sizeof(char));
if (NULL == ls->head)
{
free(ls);
return NULL;
}
ls->head->next = NULL;//空链表
return ls;
}
BOOL Insert_Head(List *ls, Data data)
{
if (NULL == ls)
return ERROR;
Node *node = (Node*)malloc(sizeof(node)/sizeof(char));//为node分配空间
if (NULL == node)
return ERROR;
node->data = data;//将要插入的数据传给node
node->next = ls->head->next;//node指向头结点指针指向的结点
ls->head->next = node;//头结点指针指向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->data = data;
node->next = NULL;//node指向NULL,表示node做最后一个结点
Node *tmp = ls->head;
while (tmp->next)//tmp遍历到最后一个结点
{
tmp = tmp->next;//tmp指向下一个结点
}
tmp->next = node;//原来的最后一个结点指向node
return TRUE;
}
BOOL Insert_Pos(List* ls, int pos, Data data)
{
if (NULL == ls || pos < 1)
return ERROR;
Node *node = (Node*)malloc(sizeof(node)/sizeof(char));
if (NULL == node)
return ERROR;
Node *tmp = ls->head;
int i;
for (i = 0; i < pos-1; i++)//tmp遍历到第pos-1个结点
{
tmp = tmp->next;
if (tmp == NULL)
{
printf("长度越界:%d\n", pos);
return ERROR;
}
}
node->data = data;//将要插入的元素赋值给结点
node->next =tmp->next;//结点指向原结点
tmp->next = node;//上一个结点指向该结点
return TRUE;
}
BOOL Delete_Pos(List* ls, int pos)
{
if (NULL == ls || pos < 1)
return ERROR;
Node *tmp = ls->head;
int i;
for (i = 0; i < pos-1; i++)//tmp遍历到第pos-1个结点
{
tmp = tmp->next;
if (tmp == NULL || tmp->next == NULL)
{
printf("长度越界:%d\n", pos);
return ERROR;
}
}
Node *p = tmp->next;//保存要删除的结点的地址
tmp->next =tmp->next->next;//将前一个结点的指针指向后一个结点
free(p);//释放删除结点的空间
return TRUE;
}
BOOL Delete_Data(List* ls, Data data)
{
if (NULL == ls)
return ERROR;
Node *tmp = ls->head;
while (tmp->next)
{
if (tmp->next->data == data)
{
Node *p = tmp->next;//保存要删除的结点的地址
tmp->next =tmp->next->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 || NULL == ls->head->next || NULL == ls->head->next->next)
return ERROR;
Node *pre = ls->head->next;//第一个结点
Node *cur = pre->next; // 第二个结点
Node *tmp;// 保存当前结点的下一个结点
while (cur)
{
tmp = cur->next;//保存结点三的地址
cur->next = pre;//将结点二指向结点一
pre = cur;//结点三作结点二
cur = tmp;//结点二作结点一
}
ls->head->next->next = NULL;//原第一个结点的指针指向NULL
ls->head = pre;//头结点指向原最后一个结点
return TRUE;
}
void Display(List *ls)
{
if (NULL == ls)
return;
Node *tmp =ls->head->next;//tmp初始化,指向第一个结点
while (tmp)//当tmp为NULL,循环结束
{
printf("%-4d", tmp->data);//打印结点数据
tmp = tmp->next;//指向下个结点
}
printf("\n");
}
void Destroy(List *ls)
{
if (NULL == ls)
return;
Node *tmp = ls->head;
while(tmp->next)
{
Node *p = tmp->next;
tmp->next = p->next;
free(p);
}
free(ls->head);
free(ls);
}
main.c
#include <stdio.h>
#include "LinkList.h"
int main()
{
List* ls = CreateList();
if (NULL == ls)
printf("failed\n");
else
printf("succeed\n");
int i;
for (i= 10; i > 0; i--)
{
Insert_Head(ls, i);
}
Display(ls);
for(i = 0; i < 10; i++)
{
Insert_Last(ls, i+1);
}
Display(ls);
Insert_Pos(ls, 6, 10086);
Display(ls);
Delete_Pos(ls, 6);
Display(ls);
Delete_Data(ls,10);
Display(ls);
Reverse(ls);
Display(ls);
Destroy(ls);
return 0;
}