1. 程式人生 > >連結串列的基本操作[C語言]

連結串列的基本操作[C語言]

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;
}