链表C语言
LinkList.h文件
#ifndef LINK_LIST_H
#define LINK_LIST_H
typedef unsigned char LElemType;
typedef struct LinkNode
{
LElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct
{
unsigned int Length;
LinkNode Head;
LinkNode* pTail;
}LinkList;
void LinkList_Init(LinkList* L);
void LinkList_Append(LinkList* L,LElemType e);
void LinkList_Traverse(LinkList L);
LElemType LinkList_GetElem(LinkList L, unsigned int i);
LElemType LinkList_Delete(LinkList* L, unsigned int i);
void LinkList_Insert(LinkList* L, unsigned int i, LElemType e);
void LinkList_Clear(LinkList* L);
void LinkList_Test(void);
#endif
LinkList.c文件
#include "LinkList.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void LinkList_Init(LinkList* L)
{
L->Length = 0;
L->Head.data = 0;
L->Head.next = NULL;
L->pTail = &L->Head;
L->pTail->data = 0;
L->pTail->next = NULL;
}
void LinkList_Append(LinkList* L,LElemType e)
{
LinkNode* NewNode = malloc(sizeof(LinkNode));
if (NewNode != NULL)
{
NewNode->data = e;
NewNode->next = NULL;
L->pTail->next = NewNode;
L->pTail = NewNode;
L->Length += 1;
}
else
printf("申请内存失败!");
}
void LinkList_Traverse(LinkList L)
{
assert(L.Head.next != NULL);
LinkNode* p = L.Head.next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
LElemType LinkList_GetElem(LinkList L, unsigned int i)
{
assert(L.Head.next != NULL);
assert(i < L.Length);
LinkNode* p = L.Head.next;
unsigned int j = 0;
while (p != NULL)
{
if (j == i)
return p->data;
p = p->next;
j++;
}
return 0;
}
LElemType LinkList_Delete(LinkList* L, unsigned int i)
{
assert(L->Head.next != NULL);
assert(i < L->Length);
LinkNode* p = &L->Head;
unsigned int j = 0;
while (p->next != NULL)
{
if (i == j)
{
LElemType e = p->next->data;
if (p->next == L->pTail)
{
L->pTail = p;
}
LinkNode* temp = p->next;
p->next = temp->next;
free(temp);
L->Length -= 1;
return e;
}
p = p->next;
j++;
}
return 0;
}
void LinkList_Insert(LinkList* L, unsigned int i, LElemType e)
{
assert(L->Head.next != NULL);
assert(i < L->Length);
LinkNode* p = &L->Head;
unsigned int j = 0;
while (p->next != NULL)
{
if (j == i)
{
LinkNode* NewNode = (LinkNode*)malloc(sizeof(LinkNode));
if (NewNode != NULL)
{
NewNode->data = e;
NewNode->next = p->next;
p->next = NewNode;
L->Length += 1;
break;
}
else
printf("申请内存不足!");
}
p = p->next;
j++;
}
}
void LinkList_Clear(LinkList* L)
{
assert(L->Head.next != NULL);
LinkNode* temp;
while (L->Head.next != NULL)
{
temp = L->Head.next;
L->Head.next = temp->next;
free(temp);
}
L->pTail = &L->Head;
}
void LinkList_Test(void)
{
LinkList L;
LinkList_Init(&L);
LinkList_Append(&L,'A');
LinkList_Append(&L,'B');
LinkList_Append(&L,'C');
LinkList_Append(&L,'D');
LinkList_Traverse(L);
printf("%c\n", LinkList_GetElem(L, 0));
LinkList_Insert(&L, 3, 'Z');
LinkList_Traverse(L);
printf("%c\n", LinkList_Delete(&L, 0));
LinkList_Traverse(L);
LinkList_Append(&L,'E');
LinkList_Traverse(L);
LinkList_Clear(&L);
LinkList_Traverse(L);
}
测试:main.c文件
#include <stdio.h>
#include "LinkList.h"
int main()
{
LinkList_Test();
return 0;
}
测试结果: