/*
* 单链表
*/#include <stdio.h>#include <stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedefint Elemtype;
typedefint Status;
typedefstruct 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;
elsereturn 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)
return0;
elseif (e1 < e2)
return -1;
elsereturn1;
}
// 返回元素e的indexint 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
listis empty
The first element is0lengthis10
The 5at6
The 6's previous element is5
The 6's next element is7
delete first element is0list:123456789
destroy success