C语言链表
要求:
typedef int DataType;
define NULL 0
typedef struct Node
{
DataType _data;
struct Node* _pNext;
}*PNode;
void InitList(PNode* pHead);
PNode BuyNode(DataType data);
// 打印链表
void PrintList(PNode pHead);
// 1、参数检测
// 2、边界条件
// 3、逻辑操作
// 尾插
void PushBack(PNode* pHead, DataType data);
// 尾删
void PopBack(PNode* pHead);
// 头插
void PushFront(PNode* pHead, DataType data);
// 头删
void PopFront(PNode* pHead);
// 返回结点在链表中的位置
PNode Find(PNode pHead, DataType data);
// 任意位置插入值为data的结点
PNode Insert(PNode pos, DataType data);
// 删除pos位置上的结点
void Erase(PNode* pHead, PNode pos);
// 求链表中节点的个数
size_t Size(PNode pHead);
// 销毁单链表
void DestroyList(PNode* pHead);
源代码:
#ifndef __ADD___H_
#define __ADD___H_
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include<assert.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}Node,*PNode;
void InitList(PNode* PHead);//初始化链表
PNode ByeNode(DataType data);//申请一个结点
void PrintList(PNode *PHead);//打印单链表
void PushBack(PNode* PHead, DataType data);//尾插
void PopBack(PNode* PHead);//尾删
void PushFront(PNode *PHead, DataType data);//头插
void PopFront(PNode *PHead);//头删
PNode Find(PNode* PHead, DataType data);//查找
void Insert(PNode pos, DataType data);//在data后插入结点
void Erase(PNode pHead, PNode pos);// 删除pos位置上的结点
int Size(PNode PHead);//求链表中结点的个数
void Destroy(PNode* PHead);//销毁
#endif
源文件
#include"标头.h"
void InitList(PNode* PHead)//初始化
{
assert(PHead);
PHead = NULL;
}
PNode ByeNode(DataType data)//申请一个结点
{
PNode newNode = NULL;
newNode = (PNode)malloc(sizeof(Node));
if (NULL == newNode)
{
printf("out of memory.\n");
exit(1);
}
else
{
newNode->data = data;
newNode->next = NULL;
}
return newNode;
}
void PopBack(PNode *PHead)//尾删
{
assert(PHead);
if (NULL == *PHead)
{
return;
}
else if (NULL == (*PHead)->next)
{
PNode TempNode = *PHead;
free(TempNode);
TempNode = NULL;
*PHead = NULL;
}
else
{
PNode PCur = *PHead;
while (PCur->next->next)
{
PCur = PCur->next;
}
PCur->next = NULL;
}
}
void PushBack(PNode* PHead, DataType data)//尾插
{
assert(PHead);
if (NULL == *PHead)
{
*PHead = ByeNode(data);
}
else
{
PNode PCur = NULL;
PCur = *PHead;
while (PCur->next)
{
PCur = PCur->next;
}
PCur->next = ByeNode(data);
}
}
void PushFront(PNode *PHead, DataType data)//头插
{
assert(PHead);
PNode PreNode = NULL;
PNode Node = ByeNode(data);
PreNode = *PHead;
Node->next = PreNode;
*PHead = Node;
}
void PopFront(PNode *PHead)//头删
{
assert(PHead);
PNode PreNode = *PHead;
if (NULL == *PHead)
{
return;
}
else if (NULL == (*PHead)->next)
{
*PHead = NULL;
}
else
{
*PHead = PreNode->next;
free(PreNode);
PreNode = NULL;
}
}
PNode Find(PNode* PHead, DataType data)//查找
{
assert(PHead);
PNode PCur = *PHead;
while (PCur)
{
if (data == PCur->data)
break;
PCur = PCur->next;
}
return PCur;
}
void Destroy(PNode* PHead)//销毁
{
assert(PHead);
PNode PCur = *PHead;
while (PCur->next)
{
PNode Dnode = PCur;
PCur = PCur->next;
free(Dnode);
Dnode = NULL;
}
}
int Empty(PNode PHead)//判空
{
if (NULL == PHead)
return 0;
else
return 1;
}
int Size(PNode PHead)//求链表中结点的个数
{
PNode Node = PHead;
DataType num = 0;
while (Node)
{
num++;
Node = Node->next;
}
return num;
}
void PrintList(PNode* PHead)//打印单链表
{
PNode PCur = *PHead;
assert(PHead);
while (PCur)
{
printf("%d->", PCur->data);
PCur = PCur->next;
}
printf("NULL\n");
}
void Insert(PNode pos, DataType data)//在data后插入结点
{
PNode newNode = ByeNode(data);
PNode PreNode = pos;
newNode->next = PreNode->next;
PreNode->next = newNode;
}
测试部分
#include"标头.h"
int main()
{
PNode mylist;
/*InitList(&mylist);
PushFront(&mylist, 1);
PushFront(&mylist, 2);
PushFront(&mylist, 3);*/
PushBack(&mylist, 4);
/*PrintList(&mylist);*/
system("pause");
return 0;
}