单向链表_笔记

.h

//链表节点
typedef struct LINKNODE
{
    void* data;             //链表数据
    struct LINKNODE* next;  //节点

}LinkNode;

//链表结构体
typedef struct LINKLIST
{
    LinkNode *head;     //头节点
    int size;           //共几个节点

}LinkList;

//打印函数指针
typedef void(*PRINTLINKNODE)(void*);

class List
{
public:
    List();
    ~List();

public:
    //在指定位置插入数据
    void Insert_Link(LinkList *list,int pos,void* data);

    //删除指定位置的值
    void RemoveByPos_List(LinkList *list, int pos);

    //查找
    int Find_List(LinkList *list,void* data);

    //获得链表的长度
    int Length_List(LinkList *list);

    //打印链表节点
    void Print_List(LinkList *list, PRINTLINKNODE print);

    //获取第一个节点位置
    void* GetFront_List(LinkList *list);

public:
    LinkNode* linknode;
    LinkList* linklist;
};

.cpp

List::List()
{
    linklist = new LinkList;
    linklist->size = 0;

    linklist->head = new LinkNode;
    linklist->head->next = 0;
    linklist->head->data = 0;



}
List::~List()
{
    if (linklist == NULL)
    {
        return;
    }

    //辅助指针变量
    LinkNode *pCurrent = linklist->head;
    while (pCurrent != NULL)
    {
        //缓存下一个节点
        LinkNode *pNext = pCurrent->next;
        delete pCurrent;
        pCurrent = pNext;

    }

    //释放链表内存
    linklist->size = 0;
    delete linklist;
}

//在指定位置插入数据
void List::Insert_Link(LinkList *list, int pos, void* data)
{
    if (list == NULL || data == NULL)
        return;

    //pos越界
    if ( pos < 0 || pos > list->size )
        pos = list->size;

    //创建新的节点
    LinkNode *newnode = new LinkNode;
    newnode->data = data;
    newnode->next = NULL;

    //找节点
    LinkNode *pCurrent = list->head;    //辅助指针
    for (size_t i = 0; i < pos; i++)
    {
        pCurrent = pCurrent->next;
    }

    //新节点入链表
    newnode->next = pCurrent->next;
    pCurrent->next = newnode;

    list->size++;


}

//删除指定位置的值
void List::RemoveByPos_List(LinkList *list, int pos)
{
    if (list == NULL)
        return;

    if (pos < 0 || pos >= list->size)
        return;

    //查找要删除节点的前一个节点
    LinkNode *pCurrent = list->head;
    for (size_t i = 0; i < pos; i++)
    {
        pCurrent = pCurrent->next;
    }

    //保存删除的节点
    LinkNode *pdel = pCurrent->next;
    pCurrent->next = pdel->next;

    //释放删除节点的内存
    delete pdel;

    list->size--;

}

//查找
int List::Find_List(LinkList *list, void* data)
{
    if (list == NULL || data == NULL)
        return -1;

    //遍历
    LinkNode* pCurren = list->head->next;
    int i = 0;
    while (pCurren != NULL)
    {
        if (pCurren->data == data)
        {
            break;
        }

        pCurren = pCurren->next;
        i++;
    }





    return i;
}

//获得链表的长度
int List::Length_List(LinkList *list)
{
    return list->size;
}

//打印链表节点
void List::Print_List(LinkList *list, PRINTLINKNODE print)
{
    if (list == NULL)
        return;

    LinkNode* pCurren = list->head->next;
    while (pCurren != NULL)
    {
        print(pCurren->data);
        pCurren = pCurren->next;
    }

}

//获取第一个节点位置
void* List::GetFront_List(LinkList *list)
{
    return list->head->next->data;
}

main.cpp

typedef struct PERSON
{
    char Name[64];
    int age;
    int score;
}Person;

void printfp(void* data)
{
    Person *p = (Person*)data;

    cout << "DataAddr:" << data << "  ";
    cout << "Nane:" << p->Name << "  ";
    cout << "Age:" << p->age << "  ";
    cout << "Score:" << p->score << "  ";
    cout << endl;


}

int main()
{
    List* l = new List();

    //创建数据类型
    Person p1 = { "Name1",18,100};
    Person p2 = { "Name2",18,99 };
    Person p3 = { "Name3",18,98 };
    Person p4 = { "Name4",18,97 }; 
    Person p5 = { "Name5",18,96 };

    //插入数据
    l->Insert_Link(l->linklist, 0, &p1);
    l->Insert_Link(l->linklist, 0, &p2);
    l->Insert_Link(l->linklist, 0, &p3);
    l->Insert_Link(l->linklist, 0, &p4);
    l->Insert_Link(l->linklist, 0, &p5);

    //打印
    l->Print_List(l->linklist, printfp);
    cout << "---------------------------------" << endl;

    //删除
    l->RemoveByPos_List(l->linklist,3);
    l->Print_List(l->linklist, printfp);
    cout << "---------------------------------" << endl;

    //返回第一个节点
    Person* ret = (Person*) l->GetFront_List(l->linklist);
    cout << "Nane:"  << ret->Name  << "  ";
    cout << "Age:"   << ret->age   << "  ";
    cout << "Score:" << ret->score << "  ";
    cout << endl;
    cout << "---------------------------------" << endl;

    //链表长度
    cout << l->Length_List(l->linklist)<<endl;
    cout << "---------------------------------" << endl;

    //查找
    cout << l->Find_List(l->linklist, l->linklist->head->next->data)<<endl;
    cout << "---------------------------------" << endl;

    delete l;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42052102/article/details/81837906