1. 程式人生 > 其它 >yh1,單鏈表的實現和新增刪除

yh1,單鏈表的實現和新增刪除

/**
 * code by wubaoshan 2022/03/27
 */

#include <iostream>
#include<stdlib.h>

using namespace std;

/**************************************************************************************************
    Project 1

    定義一個單向連結串列node, 每個節點值為int.
    定義函式void create_linklist(…, int n)來生成連結串列,連結串列長度由引數n傳入,生成的連結串列要作為引數返回,而不是當初函式返回值返回,連結串列節點值為1,2,3...n;
    定義函式reverse_linklist(...), 對引數傳入的連結串列進行逆轉;
    定義函式insert_node(node *pHead, int Index, int Value ), 在指定連結串列位置Index插入指定Value;
    定義函式delete_node(node *pHead,  int Index),刪除連結串列位置Index所在的節點;
    定義函式delete_linklist(), 刪除整個連結串列;
    定義函式print_linklist(), 列印整個連結串列。
*/

struct node
{
    int v;
    node* n;
};

/* 連結串列長度由引數n傳入,生成的連結串列要作為引數返回,而不是當初函式返回值返回,
   連結串列節點值為1,2,3...n
*/
void create_linklist(node **pHead, int n)
{
    (*pHead) = (node*)malloc(sizeof(node));
    if(NULL == pHead)
    {
        cout << "malloc failed " << endl;
    }

    (*pHead)->v = 1;  //初始位置
    (*pHead)->n = NULL;

    node *temp;
    for(int i = n; i > 1; i--)
    {
        temp = (node *)malloc(sizeof(node));
        if(NULL == temp)
        {
            cout << "malloc failed " << endl;
        }
        temp->v = i;
        temp->n = (*pHead)->n;
        (*pHead)->n = temp;
    }

}

//對引數傳入的連結串列進行逆轉
void reverse_linklist(node **pHead)
{
}

//在指定連結串列位置Index插入指定Value
// Index 為 1 ~ n 代表 1 ~ n 個節點
// Index = 0 即為頭新增
void insert_node(node **pHead,  int Index, int Value)
{
    if( NULL == *pHead )
    {
        cout << "null ptr " << endl;
    }

    node *testInset;
    node *temp;

    temp = *pHead;

    for(int i = 1; i < Index; i++)
    {
        temp = temp->n;
    }

    testInset = (node *)malloc(sizeof(node));
    if(NULL == testInset)
    {
        cout << " insert failed " << endl;
    }

    testInset->v = Value;
    testInset->n = temp->n;
    temp->n = testInset;
}

//刪除連結串列位置Index所在的節點
void delete_node(node **pHead,  int Index)
{
    node  *delNode;
    node  *delTemp;

    delNode = *pHead;

    for(int i = 1; i < Index; i++)
    {
        delNode = delNode->n;
    }

    delTemp = delNode->n;

    delNode->n = delNode->n->n;

    free(delTemp);
}

//刪除整個連結串列
void delete_linklist(node **pHead)
{
    node *delList;
    node *delTemp;

    delList = (*pHead)->n;
    while( delList != NULL)
    {
        delTemp = delList->n;
        free(delList);
        delList = delTemp;
    }

    delList->n = NULL;
    cout << "delete list sucess " << endl;

}

//列印整個列表
void print_linklist(node **pHead)
{
    if(NULL == *pHead)
    {
        cout << "printf empty" << endl;
    }
    node *print;
    print = (*pHead)->n;
    cout << (*pHead)->v << endl;
    for(print; print != NULL; print = print->n)
    {
        cout << print->v << endl;
    }

}

int main()
{
    node *pHead = nullptr;
    int n = 10;

    cout << "==========Project1=================" << endl;

    /**初始化建立**/
    cout << "init node " << endl;
    create_linklist(&pHead, n);
    print_linklist(&pHead);

    /**插入節點**/
    cout << "insert node " << endl;
    insert_node(&pHead,8,15);
    print_linklist(&pHead);


    /**刪除節點**/
    cout << "delte node " << endl;
    delete_node(&pHead,7);
    print_linklist(&pHead);


    /**連結串列逆轉**/
    //reverse_linklist(&pHead);
    //print_linklist(&pHead);

    /**刪除連結串列**/
    cout << "delte list " << endl;
    delete_linklist(&pHead);
    print_linklist(&pHead);

    cout << "==========Project1=================" << endl;
    cout << endl;

    return 0;
}