【C++】链表学习

#include "stdafx.h"
#include <iostream>
using namespace std;

typedef struct Node
{
    int nVal;
    Node *pNext;
}Link,*pLink;

Link * CreateLink(int arr[], int n)
{
    if (0 == n)
    {
        return NULL;
    }

    Link *pNew = new Link;
    pNew->nVal = 0;
    pNew->pNext = NULL;

    Link *pRet = pNew;
    for (int i=0; i<n; i++)
    {
        Node *p = new Node;
        p->nVal = arr[i];
        p->pNext = NULL;
        pNew->pNext = p;
        pNew = pNew->pNext;
    }
    return pRet->pNext;
}
void PrintLink(Link *pNew)
{
    if (pNew == NULL)
    {
        cout<<"链表为空!"<<endl;
        return;
    }
    Link *p = pNew;
    while (p != NULL)
    {
        cout<<p->nVal;
        p = p->pNext;
        if (p != NULL)
        {
            cout<<"->";
        }
        else
        {
            cout<<endl;
        }
    }
}
void FreeLink(Link *&pNew)
{
    Node *p = NULL;
    while (pNew)
    {
        p = pNew->pNext;
        delete pNew;
        pNew = p;
    }
    pNew = NULL;
}
void DeleteValFromLink(Link *&pNew,int nVal)
{
    Node head;
    head.nVal = -1;
    head.pNext = pNew;

    Node *pHead = &head;
    Node *pCur = NULL;
    while (pHead->pNext != NULL)
    {
        pCur = pHead->pNext;
        if (pHead->pNext->nVal == nVal)
        {
            pHead->pNext = pHead->pNext->pNext;
            delete pCur;
            pCur = NULL;
        }
        else
        {
            pHead = pHead->pNext;
        }
    }
    pNew = head.pNext;
}
void ModifyValFromLink(Link *&pNew,int nPos,int nVal)
{
    if (pNew == NULL)
    {
        return;
    }

    Node head;
    head.nVal = -1;
    head.pNext = pNew;

    int i = 0;
    Node *pHead = &head;
    while (pHead->pNext != NULL)
    {
        if (nPos == ++i)
        {
            pHead->pNext->nVal = nVal;
            break;
        }
        pHead = pHead->pNext;
    }
    pNew = head.pNext;
}
void InsertNodeToLink(Link *&pNew, int nPos,int nVal)
{
    Node *insertNode  = new Node;
    insertNode->nVal = nVal;
    insertNode->pNext = NULL;

    Node head;
    head.nVal = -1;
    head.pNext = pNew;

    int i = 0;
    Node *pHead = &head;
    while (pHead->pNext != NULL)
    {
        if (nPos == ++i)
        {
            insertNode->pNext = pHead->pNext;
            pHead->pNext = insertNode;
            break;
        }
        pHead = pHead->pNext;
    }
    pNew = head.pNext;
}
void main()
{
    int arr[] = {1,2,2,1,4,5};
    Link *pNew = CreateLink(arr,sizeof(arr)/sizeof(arr[0]));
    PrintLink(pNew);
    //     DeleteValFromLink(pNew,2);
    //     DeleteValFromLink(pNew,1);
    //     PrintLink(pNew);
    //InsertNodeToLink(pNew,4,3);
    //PrintLink(pNew);
    //ModifyValFromLink(pNew,5,10);
    //PrintLink(pNew);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值