【C++】【三】单向链表

怎甘沉沦 提交于 2020-11-18 15:29:11

// 单向链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

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

typedef struct LINKNODE {
    void* data;
    struct LINKNODE* next;
}linknode;


typedef struct LINKLIST {
    LINKNODE* head;
    int size;
}linklist;
//print function ptr
typedef void(*PRINTLINKNODE)(void*);




//init
linklist* Init_linklist() {
    linklist* list = (linklist*)malloc(sizeof(linklist));
    list->size=0;
    //头节点,方便判断位置
    list->head = (linknode*)malloc(sizeof(linknode));
    list->head->data = NULL;
    list->head->next = NULL;






    return list;
}

void Insert_linklist(linklist* list, int pos, void* data) {
    if (list == NULL) {
        return;
    }
    if (data == NULL) {
        return;
    }
    if (pos < 0 || pos > list->size) {
        pos = list->size;
    }
    //创建新节点
    linknode* newnode = (linknode*)malloc(sizeof(linknode));
    newnode->data = data;
    newnode->next = NULL;
    //查找待插入位置    //遍历位置    //辅助指针变量













    linknode* pcur = list->head;
    for (int i = 0; i < pos; ++i) {
        pcur = pcur->next;
    }
    //插入  
    newnode->next = pcur->next;
    pcur->next = newnode;





    list->size++;
}

void RemoveByPos_linklist(linklist* list, int pos) {
    if (list == NULL) {
        return;
    }
    if (pos < 0 || pos >= list->size) {
        return;
    }
    //查找删除节点的前一个节点
    linknode* pcur = list->head;
    for (int i = 0; i < pos; ++i) {
        pcur = pcur->next;
    }
    linknode* pdel = pcur->next;
    pcur->next = pdel->next;












    free(pdel);
    list->size--;
}

void RemoveByValue_linklist(linklist* list, void* data) {

}

int Size_linklist(linklist* list) {
    return list->size;
}

int Find_list(linklist* list, void* data) {
    if (list == NULL) {
        return -1;
    }
    if (data == NULL) {
        return-1;
    }
    //遍历查找
    linknode* pcur = list->head->next;
    int i = 0;
    while (pcur != NULL) {
        if (pcur->data == data) {
            break;
        }
        i++;
        pcur = pcur->next;
    }
    return i;
}
//返回第一个节点
void* Front_linklist(linklist* list) {
    return list->head->next->data;
}





















void Free_linklist(linklist* list) {
    if (list == NULL) {
        return;
    }
   
    linknode* pcur = list->head;
    while (pcur != NULL) {
        linknode* pnext = pcur->next;
        free(pcur);
        pcur = pnext;//move node/ptr
    }
    list->size = 0;
    free(list);
}












void Print_linklist(linklist* list,PRINTLINKNODE print) {
    if (list == NULL) {
        return;
    }
    //节点遍历
    linknode* pcur = list->head->next;
    while (pcur != NULL) {
        //调用户传进来的函数
        print(pcur->data);
        pcur = pcur->next;
    }
}











typedef struct PERSON {
    char name[64];
    int age;
    int score;
}person;




void myprint(void* data) {
    person* p = (person*)data;
    printf("name:=%s,age=%d,score=%d\n", p->name, p->age, p->score);
}


int main()
{

    linklist* list = Init_linklist();
    person p1 = { "aaa",18,100 };
    person p2 = { "bbb",19,99 };
    person p3 = { "ccc",20,101 };
    person p4 = { "ddd",17,97 };
    person p5 = { "eee",16,59 };




    Insert_linklist(list, 0, &p1);
    Insert_linklist(list, 0, &p2);
    Insert_linklist(list, 0, &p3);
    Insert_linklist(list, 0, &p4);
    Insert_linklist(list, 0, &p5);
    //打印
    Print_linklist(list, myprint);
    printf("-------------------------------\n");
    //删除
    RemoveByPos_linklist(list, 3);
    Print_linklist(list, myprint);
    printf("-------------------------------\n");
    //返回第一个节点
    person* ret =(person*)Front_linklist(list);
    printf("name=%s,age=%d,score=%d\n", ret->name, ret->age, ret->score);
    printf("-------------------------------\n");














    //销毁
    Free_linklist(list);

    system("pause");
    return 0;
}
 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!