您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】数据结构C语言的实现(单链表)

2016-12-17 13:25 716 查看

单链表

/*
* 单链表
*/
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Elemtype;
typedef int Status;

typedef struct LNode
{
Elemtype data;      // 元素数据
struct LNode *next; // 指向下一个元素的指针
} LNode, *LinkList;

// 初始化链表
void InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(LNode));
if (!L)
exit(OVERFLOW);
(*L)->next = NULL;
}

// 销毁链表
void DestroyList(LinkList *L)
{
LinkList temp;
while (*L)
{
temp = (*L)->next;
free(*L);
*L = temp;
}
}

// 清空链表
void ClearList(LinkList L)
{
LinkList p = L->next;
L->next = NULL;
DestroyList(&p);
}

// 判断链表是否为空
Status isEmpty(LinkList L)
{
if (L->next)
return FALSE;
else
return TRUE;
}

// 获取链表长度
int GetLength(LinkList L)
{
int i = 0;
LinkList p = L->next;
while (p)
{
i++;
p = p->next;
}
return i;
}

// 获取链表第i个元素
Status GetElem(LinkList L, int i, Elemtype *e)
{
int j = 1;
LinkList p = L->next;
while (p && j < i)
{
j++;
p = p->next;
}

if (!p || j > 1)
return ERROR;
*e = p->data;
return OK;
}

// 比较两个元素
Status compare(Elemtype e1, Elemtype e2)
{
if (e1 == e2)
return 0;
else if (e1 < e2)
return -1;
else
return 1;
}

// 返回元素e的index
int FindElem(LinkList L, Elemtype e, Status (*compare)(Elemtype, Elemtype))
{
int i = 0;
LinkList p = L->next;
while (p)
{
i++;
if (!compare(p->data, e))
return i;
p = p->next;
}
return -1;
}

// 返回前一个元素(如果有的话)
Status PreElem(LinkList L, Elemtype cur_e, Elemtype *pre_e)
{
LinkList q, p = L->next;
while (p->next)
{
q = p->next;
if (q->data == cur_e)
{
*pre_e = p->data;
return OK;
}
p = q;
}
return ERROR;
}

// 返回下一个元素(如果有的话)
Status NextElem(LinkList L, Elemtype cur_e, Elemtype *next_e)
{
LinkList q, p = L->next;
while (p->next)
{
if (p->data == cur_e)
{
*next_e = p->next->data;
return OK;
}
p = p->next;
}
return ERROR;
}

// 在index = i处插入元素e
Status InsertElem(LinkList L, int i, Elemtype e)
{
int j = 0;
LinkList s, p = L;
// 让p指向第i-1个元素
while (p && j < i - 1)
{
j++;
p = p->next;
}

if (!p || j > i - 1)
return ERROR;
// 在第i个位置插入元素e
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}

// 删除第i个元素,被删除的元素通过指针*e返回
Status DeleteElem(LinkList L, int i, Elemtype *e)
{
int j = 0;
LinkList q, p = L;
// 让p指向第i-1个元素
while (p->next && j < i - 1)
{
j++;
p = p->next;
}

if (!p->next || j > i - 1)
return ERROR;
// 删除第i个元素
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return OK;
}

// 访问元素
void visit(Elemtype e)
{
printf("%d ", e);
}

// 遍历线性表
void TraverseList(LinkList L, void (*visit)(Elemtype))
{
LinkList p = L->next;
while (p)
{
visit(p->data);
p = p->next;
}
}

/*
* 主函数测试
*/
int main()
{
LinkList L;
InitList(&L);
Elemtype e;
int i;
if (L)
printf("init success\n");

if (isEmpty(L))
printf("list is empty\n");
for (i = 0; i < 10; i++)
InsertElem(L, i + 1, i);
if (GetElem(L, 1, &e))
printf("The first element is %d\n", e);

printf("length is %d\n", GetLength(L));
printf("The 5 at %d\n", FindElem(L, 5, *compare));
PreElem(L, 6, &e);
printf("The 6's previous element is %d\n", e);
NextElem(L, 6, &e);
printf("The 6's next element is %d\n", e);
DeleteElem(L, 1, &e);
printf("delete first element is %d\n", e);
printf("list:");
TraverseList(L, visit);

DestroyList(&L);
if (!L)
printf("\ndestroy success\n");
}


init success
list is empty
The first element is 0
length is 10
The 5 at 6
The 6's previous element is 5
The 6's next element is 7
delete first element is 0
list:1 2 3 4 5 6 7 8 9
destroy success
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 c语言