头文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <malloc.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}Node, *pNode, List, *pList;
void InitLinkList(pList* pplist);
void DestroyLinkList(pList* pplist);
int GetListLength(pList plist);
void PushFront(pList* pplist, DataType d);
void PushBack(pList* pplist, DataType d);
pNode BuyNode(DataType d);
void PrintLinkList(pList plist);
void PopFront(pList* pplist);
void PopBack(pList* pplist);
pNode Find(pList plist, DataType d);
#endif
函数文件
#include"LinkList.h"
void InitLinkList(pList * pplist)
{
assert(pplist != NULL);
*pplist = NULL;
}
void PrintLinkList(pList plist)
{
pNode cur = plist;
if (NULL == plist)
{
printf(" ");
return;
}
while (cur != NULL)
{
printf("%d-->", cur->data);
cur = cur->next;
}
printf("Over\n");
}
void PushFront(pList * pplist, DataType d)
{
pNode newNode = NULL;
assert(pplist != NULL);
newNode = BuyNode(d);
newNode->next = *pplist;
*pplist = newNode;
}
void PushBack(pList * pplist, DataType d)
{
pNode newNode = BuyNode(d);//利用BuyNode创建新节点
assert(pplist != NULL);
if (*pplist == NULL)//空链表
{
*pplist = newNode;//将头指针和新节点挂链起来
}
else//非空链表
{
pNode cur = *pplist;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = newNode;
}
}
int GetListLength(pList plist)
{
pNode cur = plist;
int count = 0;
while (cur)
{
count++;
cur = cur->next;
}
return count;
}
pNode BuyNode(DataType d)
{
pNode newNode = (pNode)malloc(sizeof(Node));//开辟新节点
if (NULL == newNode)
{
exit(EXIT_FAILURE);
}
newNode->data = d;
newNode->next = NULL;
return newNode;
}
void DestroyLinkList(pList * pplist)
{
pNode cur = NULL;
assert(pplist != NULL);
cur = *pplist;
while (cur)
{
pNode del = cur;
cur = cur->next;
free(del);
del = NULL;
}
*pplist = NULL;
}
void PopBack(pList * pplist)
{
assert(pplist != NULL);
if (*pplist == NULL)//没有节点
{
return;
}
if ((*pplist)->next == NULL)//一个节点
{
free(*pplist);
*pplist = NULL;
return;
}
else//一个以上的节点
{
pNode cur = *pplist;
while (cur->next->next != NULL)
{
cur = cur->next;
}
free(cur->next);
cur->next = NULL;
}
}
void PopFront(pList * pplist)
{
assert(pplist != NULL);
if (*pplist == NULL)//没有节点
{
return;
}
else//有节点
{
pNode del = *pplist;
*pplist = del->next;
free(del);
del = NULL;
}
}
pNode Find(pList plist, DataType d)
{
pNode cur = plist;
while (cur)
{
if (cur->data == d)
{
return cur;
}
cur = cur->next;
}
return NULL;//没找到
}
测试文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"LinkList.h"
void test()
{
Node* plist = NULL;//指向第一个节点的指针
InitLinkList(&plist);//初始化plist为空指针,所以要传地址
PushBack(&plist, 1);//传地址的原因:当链表中没有节点时,要改变plist,所以要传地址
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PrintLinkList(plist);
/*DestroyLinkList(&plist);
PrintLinkList(plist);*/
printf("%d个节点\n", GetListLength(plist));
}
void TestPopBack()
{
Node* plist = NULL;//指向第一个节点的指针
InitLinkList(&plist);//初始化plist为空指针,所以要传地址
PushBack(&plist, 1);//传地址的原因:当链表中没有节点时,要改变plist,所以要传地址
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PrintLinkList(plist);
PopBack(&plist);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void TestPushFront()
{
Node* plist = NULL;//指向第一个节点的指针
PushFront(&plist, 1);
PushFront(&plist, 2);
PushFront(&plist, 3);
PushFront(&plist, 4);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void TestPopFront()
{
Node* plist = NULL;//指向第一个节点的指针
PushFront(&plist, 1);
PushFront(&plist, 2);
PushFront(&plist, 3);
PushFront(&plist, 4);
PrintLinkList(plist);
PopFront(&plist);
PrintLinkList(plist);
DestroyLinkList(&plist);
}
void TestFind()
{
Node* plist = NULL;//指向第一个节点的指针
pNode pos = NULL;
PushFront(&plist, 1);
PushFront(&plist, 2);
PushFront(&plist, 3);
PushFront(&plist, 8);
PrintLinkList(plist);
pos = Find(plist, 1);
if (pos != NULL)
{
printf("%d\n", pos->data);
}
PrintLinkList(plist);
DestroyLinkList(&plist);
}
int main()
{
/*test();*/
//TestPopBack();
//TestPushFront();
/*TestPopFront();*/
/*TestFind();*/
system("pause");
return 0;
}