C++中单链表

链表的含义
1) 由n个节点离散分配
2) 每个节点通过指针连接
3) 每一个节点由一个前驱节点和一个后驱节点
4)首节点没有前驱节点,尾节点没有后驱节点

节点的构成
节点由两部分构成
1、数据域,用来存放有效数据
2、指针域,用来存放下一个节点

节点构造
  首节点:存放第一个有效数据的节点;
   尾节点:存放最后一个有效数据的节点;
    头节点:头节点的数据类型与首节点的数据类型相同,并且头节点是首节点前面的那个节点,并不存放有效数据;头节点的存在只是为了方便链表的操作。
   头指针:指向头节点的指针;
   尾指针:指向尾节点的指针;

main.cpp
#include <iostream>
#include "Node.h"
int main() {
    PNODE  p= creat(5,1,2,3,4,5);
    print(p);
    p=del(p,4);
    print(p);
    p=insert(p,2,222);
    print(p);
    p = resver(p);
    print(p);
    return 0;
}

Node.cpp
//
// Created by yang on 2017/12/13.
//
//链表 中一个头指针 存放一个地址   每个地址表示一个节点
#include "Node.h"
#include <stdarg.h>
#include <iostream>
#include <string.h>
PNODE creat(int i ,...)
{
    PNODE head,pnew,ptail;  // head  --> 头指针,返回值  pnew 用来存放新申请的节点的值  ptail -> 尾节点,存放链表尾节点地址

    pnew = new NODE();
    std::cout << pnew << std::endl;
    va_list va_p;
    va_start(va_p,i);
    for(int n = 1;n <= i;++n)
    {
        int tmp = va_arg(va_p, int);
        std::cout << tmp  << std::endl;
        if(1 == n)
        {
            head = pnew;
            ptail->pNext = NULL;
        }
        else{
            ptail->pNext = pnew;
        }
        ptail = pnew;  //把新申请的节点地址给尾节点,pnew 存放新的地址
        ptail->data = tmp;
        pnew = new NODE();
    }
    ptail->pNext = NULL;
    delete pnew;
    va_end(va_p);
    std::cout << head << std::endl;
    return  head;
}

void print(PNODE head)
{
    PNODE p = head;
    while(p)
    {
        p = p->pNext;
    }
}

PNODE  del(PNODE phead, int num)
{
    PNODE pre,pnow;  //pre 上一个节点 pnow 现在的节点

    pnow = phead;
    while(pnow->data != num && pnow->pNext)
    {
        pre = pnow;
        pnow = pnow->pNext;
    }
    if(pnow->data == num)
    {
        if (phead == pnow)
            phead->pNext = pnow->pNext;
        else
            pre->pNext = pnow->pNext;
    } else{
        std::cout << "No data Find!" << std::endl;
    }
    return phead;
}

PNODE  insert(PNODE phead,int num,int data)
{
    PNODE pnew = NULL;
    if(phead == NULL)
    {
        pnew = new NODE;
        phead->pNext = pnew;
        phead->data = data;
    }
    PNODE pnow = phead;
    while (pnow->pNext&&pnow->data != num)
    {
        pnow = pnow->pNext;
    }
    if(num == pnow->data){
        pnew = new NODE;
        pnew->data = data;
        pnew->pNext = pnow->pNext;
        pnow->pNext = pnew;
    }
    else{
        std::cout << "Data Not Find!" << std::endl;
    }
    return phead;
}

PNODE resver(PNODE phead)
{
    PNODE pnow,ptmp,pnext; //  pnow 上一个节点 ptmp 临时存放变量  pnext 当前操作节点
    pnow = NULL;
    pnext = phead;
    while (pnext)
    {
        ptmp = pnext->pNext;
        pnext->pNext = pnow;
        pnow = pnext;
        pnext = ptmp;
    }
    return pnow;
}

Node.h
//
// Created by yang on 2017/12/13.
//

#ifndef LIST_NODE_H
#define LIST_NODE_H

typedef struct Node{
    int data;
    struct Node *pNext;
}NODE,*PNODE;
//定义了两个新的数据类型 Node ---> struct Node PNODE ----> struct Node*


PNODE creat(int i,...);
void print(PNODE head);
PNODE  del(PNODE phead, int num);
PNODE  insert(PNODE phead,int num,int data);
PNODE resver(PNODE phead);


class List{
public:
    List(){};
    ~List(){};
private:
    int m_n;
};
#endif //LIST_NODE_H
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(list)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp Node.cpp Node.h)
add_executable(list ${SOURCE_FILES})
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值