- LinkList.h(各类函数的声明)
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <windows.h>
#include <assert.h>
typedef int DataType;
typedef struct SListNode
{
struct SListNode* _next;
DataType _data;
}SListNode;
SListNode* BuySListNode(DataType x); //创建一个节点
void SListPrint(SListNode* pHead); //打印链表
void SListDestory(SListNode** ppHead); //删除链表
void SListPushBack(SListNode** ppHead, DataType x); //尾部插入
void SListPopBack(SListNode** ppHead); //尾部删除
void SListPushFront(SListNode** ppHead, DataType x); //头部插入
SListNode* SListFind(SListNode* pHead, DataType x); //查找指定元素
void SListAt(SListNode** ppHead, SListNode* pos, DataType x); //修改指定节点
void SListInsert(SListNode** ppHead, SListNode* pos, DataType x); //在指定位置插入指定元素
void SListErase(SListNode** ppHead, SListNode* pos); //删除指定位置的元素
#endif
2.LinkList.c(功能实现)
#include "LinkList.h"
SListNode* BuySListNode(DataType x) //创建一个节点
{
SListNode* newNode = (SListNode*)malloc(sizeof(SListNode)); //开辟空间
if (NULL == newNode)
{
printf("Create failure!\n");
exit(1);
}
newNode->_data = x;
newNode->_next = NULL;
return newNode;
}
void SListPrint(SListNode* pHead) //打印链表
{
if (NULL == pHead)
{
printf("print fail, LinkList is empty!\n");
}
else
{
while (pHead != NULL)
{
printf("%d -> ", pHead->_data);
pHead = pHead->_next;
}
printf("NULL \n");
}
}
void SListDestory(SListNode** ppHead) //删除链表
{
assert(ppHead != NULL);
SListNode* tem = NULL;
if (NULL == *ppHead)
return;
while (*ppHead != NULL)
{
tem = (*ppHead)->_next;
free(*ppHead);
*ppHead = NULL;
*ppHead = tem;
}
}
void SListPushBack(SListNode** ppHead, DataType x) //尾部插入
{
assert(ppHead != NULL);
SListNode* cur = *ppHead;
if (*ppHead == NULL) //链表为空
{
*ppHead = BuySListNode(x);
(*ppHead)->_next = NULL;
}
else
{
cur = *ppHead;
while (cur->_next != NULL)
{
cur = cur->_next;
}
cur->_next = BuySListNode(x);
}
}
void SListPopBack(SListNode** ppHead) //尾部删除
{
assert(ppHead != NULL);
SListNode* cur = *ppHead; //记录当前节点
SListNode* pvr = NULL; //记录当前节点的前一个节点
if (NULL == cur)
{
printf("Pop fail, the LinkList is empty!\n");
}
else if (NULL == cur->_next) //只有一个节点
{
cur = cur->_next;
free(cur);
}
else //有多个节点
{
while (cur->_next != NULL)
{
pvr = cur;
cur = cur->_next;
}
free(cur);
pvr->_next = NULL;
}
}
void SListPushFront(SListNode** ppHead, DataType x) //头部插入
{
assert(ppHead != NULL);
SListNode* cur = NULL;
if (NULL == *ppHead)
{
*ppHead = BuySListNode(x);
(*ppHead)->_next = NULL;
}
else
{
cur = BuySListNode(x);
cur->_next = *ppHead;
*ppHead = cur;
}
}
SListNode* SListFind(SListNode* pHead, DataType x) //查找指定元素
{
assert(NULL != pHead);
while (pHead != NULL)
{
if (x == pHead->_data)
return pHead;
else
pHead = pHead->_next;
}
printf("Non-existent!\n");
return NULL;
}
void SListAt(SListNode** ppHead, SListNode* pos, DataType x) //修改指定节点
{
assert(ppHead != NULL && pos != NULL);
SListNode* cur = *ppHead;
while (cur != NULL)
{
if (cur == pos)
{
cur->_data = x;
return;
}
else
{
cur = cur->_next;
}
}
}
void SListInsert(SListNode** ppHead, SListNode* pos, DataType x) //在指定位置插入指定元素
{
assert(ppHead != NULL && pos != NULL);
SListNode* pvr = *ppHead; //用来标记pos的前一个节点位置
SListNode* newNode = BuySListNode(x);
if (NULL == pvr || pvr == pos) //链表为空 或者 插入的位置是第一个节点
{
SListPushFront(ppHead, x);
}
else
{
pvr = *ppHead;
while (pvr->_next != pos)
{
pvr = pvr->_next;
}
newNode->_next = pos;
pvr->_next = newNode;
}
}
void SListErase(SListNode** ppHead, SListNode* pos) //删除指定位置的元素
{
assert(ppHead != NULL && pos != NULL);
SListNode* cur = *ppHead; //记录当前节点
SListNode* pvr = NULL; //记录当前节点的前一个节点
if (*ppHead == pos)//删除第一个节点
{
*ppHead = cur->_next;
free(cur);
}
else
{
pvr = *ppHead;
while (pvr->_next != pos)
{
pvr = pvr->_next;
}
pvr->_next = pos->_next;
free(pos);
}
}
3.test.c(测试用例)
#include "LinkList.h"
/********************************************************************
created: 2017/12/13
file base: main
file ext: c
author: Tianzez
purpose: 对不带头结点的单链表进行操作(C语言描述)
*********************************************************************/
void testPushBack() //测试尾插
{
SListNode* list = NULL;
SListPushBack(&list, 1);
SListPrint(list);
SListPushBack(&list, 2);
SListPrint(list);
SListPushBack(&list, 3);
SListPrint(list);
}
void testDestory() //删除链表
{
SListNode* list = NULL;
SListPushBack(&list, 1);
SListPushBack(&list, 2);
SListPushBack(&list, 3);
SListPrint(list);
SListDestory(&list);
SListPrint(list);
}
void testPopBack() //测试尾删
{
SListNode* list = NULL;
SListPushBack(&list, 1);
SListPushBack(&list, 2);
SListPushBack(&list, 3);
SListPrint(list);
SListPopBack(&list);
SListPrint(list);
SListPopBack(&list);
SListPrint(list);
SListPopBack(&list);
SListPrint(list);
SListPopBack(&list);
SListPrint(list);
}
void testPushFront() //测试头插
{
SListNode* list = NULL;
SListPushFront(&list, 1);
SListPushFront(&list, 2);
SListPushFront(&list, 3);
SListPrint(list);
}
void testFind() //测试查找
{
SListNode* list = NULL;
SListPushFront(&list, 1);
SListPushFront(&list, 2);
SListPushFront(&list, 3);
SListPrint(list);
SListPrint(SListFind(list, 1));
SListPrint(SListFind(list, 2));
SListPrint(SListFind(list, 3));
SListPrint(SListFind(list, 4));
}
void testAt()//测试修改指定节点
{
SListNode* list = NULL;
SListPushFront(&list, 1);
SListPushFront(&list, 2);
SListPushFront(&list, 3);
SListPrint(list);
SListNode* ret = SListFind(list, 3);
SListAt(&list, ret, 30);
SListPrint(list);
}
void testInsert() //测试插入
{
{ //测试插入位置为第一个节点
SListNode* list = NULL;
SListPushBack(&list, 1);
SListPushBack(&list, 2);
SListPushBack(&list, 3);
SListPrint(list);
SListNode* ret = SListFind(list, 1);
SListInsert(&list, ret, 0);
SListPrint(list);
};
printf("\n\n\n");
{ //测试插入位置为中间
SListNode* list = NULL;
SListPushFront(&list, 1);
SListPushFront(&list, 2);
SListPushFront(&list, 3);
SListPrint(list);
SListNode* ret = SListFind(list, 2);
SListInsert(&list, ret, 10);
SListPrint(list);
};
}
void testErase()//测试删除
{
{ //测试删除第一个节点
SListNode* list = NULL;
SListPushBack(&list, 1);
SListPushBack(&list, 2);
SListPushBack(&list, 3);
SListPrint(list);
SListNode* ret = SListFind(list, 1);
SListErase(&list, ret);
SListPrint(list);
};
printf("\n\n\n");
{ //测试删除中间的节点
SListNode* list = NULL;
SListPushFront(&list, 1);
SListPushFront(&list, 2);
SListPushFront(&list, 3);
SListPrint(list);
SListNode* ret = SListFind(list, 2);
SListErase(&list, ret);
SListPrint(list);
};
}
int main()
{
//testPushBack(); //尾插
//testDestory(); //删除链表
//testPopBack(); //尾删
//testPushFront(); //头插
//testFind(); //测试查找
//testInsert(); //测试插入
//testErase();//测试删除
system("pause");
return 0;
}