您的位置:首页 > 编程语言 > C语言/C++

链表的基本操作[C语言]

2017-10-15 15:20 501 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 c语言