链表实现

来源:互联网 发布:新装系统无法连接网络 编辑:程序博客网 时间:2024/06/07 20:10

LinkList.h

#pragma once #include<iostream>typedef struct Node{    int data;    Node* next;}*NPoint;class LinkList{private:    NPoint head; // 头指针public:    LinkList();    ~LinkList();    bool Empty();    void Clear();    void AddData(int value);   //链表后面添加    void InsertAfter(int key, int value); //在key后面插入value    NPoint FindData(int key);    void DeleteData(int key);    int ListLength(); //链表长度    void PrintList();//输出链表};LinkList::LinkList(){    head = (NPoint)malloc(sizeof(Node));    head->next = NULL;}LinkList::~LinkList(){    Clear();    free(head);}//判空bool LinkList::Empty(){    if (head->next != NULL)        return false;    return true;}//清空 只剩下头指针void LinkList::Clear(){    NPoint deleteP; //这些多余的局部指针变量会在作用域结束后自动被回收 因为指针本身放在栈中 而其指向的内容是放在堆中    NPoint p = head->next;    head->next = NULL;    while (p)    {        deleteP = p; //这里必须先用一个指针指向要删除的当前指针 不然删除后再做 p=p->next 会报错        p = p->next;        free(deleteP);    }}//添加void LinkList::AddData(int value){    NPoint node = (NPoint)malloc(sizeof(Node));    node->data = value;    node->next = NULL;    NPoint p = head;    while (p->next)        p = p->next;    p->next = node;}//在key后面插入valuevoid LinkList::InsertAfter(int key, int value){    NPoint node = (NPoint)malloc(sizeof(Node));    node->data = value;    NPoint p = head;    while (p->next && p->next->data != key)        p = p->next;    node->next = p->next->next;    p->next->next = node;    //使用以下两句就是在key之前插入value    //node->next = p->next;    //p->next = node;}//查找NPoint LinkList::FindData(int key){    NPoint p = head->next;    while (p && p->data != key)        p = p->next;    return p;}//删除void LinkList::DeleteData(int key){    NPoint p = head;    while (p->next && p->next->data != key)        p = p->next;    if (p)    {        NPoint deleteP = p->next;        p->next = deleteP->next;        free(deleteP);    }}//链表长度int LinkList::ListLength(){    int length = 0;    NPoint p = head->next;    while (p)    {        p = p->next;        length++;    }    return length;}//输出链表void LinkList::PrintList(){    if (Empty())        std::cout << "List Empty!\n";    else    {        NPoint p = head->next;        while (p)        {            std::cout << p->data << " ";            p = p->next;        }        std::cout << "\n";    }}

LinkListTest.cpp

#include"LinkList.h"#include<iostream>using namespace std;int main(){    LinkList* L = new LinkList();    cout << L->ListLength() << endl;    L->PrintList();    L->AddData(5);    L->InsertAfter(5, 2);    L->PrintList();    L->InsertAfter(5, 3);    L->PrintList();    L->DeleteData(5);    L->PrintList();    cout << L->ListLength() << endl;    delete L;    return 0;}
0 0
原创粉丝点击