連結串列的基本操作[C語言]
阿新 • • 發佈:2019-02-20
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;
}