16C++ 数据结构

线性表顺序存储

sqlist.h

#pragma once
#include 

typedef void SeqList;
typedef void SeqListNode;

SeqList* SeqList_Create(int capacity);

void SeqList_Destroy(SeqList* list);

void SeqList_Clear(SeqList* list);

int SeqList_Length(SeqList* list);

int SeqList_Capacity(SeqList* list);

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

SeqListNode* SeqList_Get(SeqList* list, int pos);

SeqListNode* SeqList_Delete(SeqList* list, int pos);

sqlist.c

#include "seqlist.h"

typedef struct _tag_SeqList {
    int length;
    int capacity;
    unsigned int* node;
}TSeqList;

SeqList* SeqList_Create(int capacity) {
    int ret = 0;
    TSeqList* list = NULL;
    list = (TSeqList*)malloc(sizeof(TSeqList));
    if (list == NULL) {
        ret = -1;
        printf("func SeqList_Create failed ret =%d\n", ret);
        return NULL;
    }
    memset(list, 0, sizeof(TSeqList));
    //根据capacity大小指定节点空间大小
    list->node = (unsigned int*)malloc(sizeof(unsigned int*) * capacity);
    if (list->node == NULL) {
        ret = -1;
        printf("list->node malloc failed ret =%d\n", ret);
        return NULL;
    }

    list->capacity = capacity;
    list->length = 0;
    return list;
}

void SeqList_Destroy(SeqList* list) {
    if (list == NULL)
    {
        return;
    }
    TSeqList* tList = list;
    if (tList->node != NULL) {
        free(tList->node);
    }
    free(tList);
    return;
}

void SeqList_Clear(SeqList* list) {
    if (list == NULL)
    {
        return;
    }
    TSeqList* tList = list;
    tList->length = 0;
    return;
}

int SeqList_Length(SeqList* list) {
    int ret = 0;
    if (list == NULL)
    {
        return ret;
    }
    TSeqList* tList = list;
    return tList->length;
}

int SeqList_Capacity(SeqList* list) {
    int ret = 0;
    if (list == NULL)
    {
        return ret;
    }
    TSeqList* tList = list;
    return tList->capacity;
}

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) {
    int ret = 0;
    if (list == NULL || pos < 0 || node == NULL)
    {
        printf("SeqList_Insert fail ret=", ret = -1);
        return ret = -1;
    }
    TSeqList* tList = list;
    if (tList->node == NULL) {
        printf("SeqList_Insert fail tList->node = null,ret=", ret = -1);
        return ret = -1;
    }

    //判断是否容量已满
    if (tList->length == tList->capacity) {
        printf("capacity full", ret = -2);
        return ret = -2;
    }

    //判断pos正确性
    if (pos > tList->length) {
        pos = tList->length;
    }
    for (int i = tList->length; i > pos; i--) {
        //从后往前,将每一个元素后移一位,然后将插入的元素放在pos位置上
        tList->node[i] = tList->node[i - 1];
    }
    tList->node[pos] =(unsigned int*)node;
    tList->length++;
    return ret;
}

SeqListNode* SeqList_Get(SeqList* list, int pos) {
    int ret = 0;
    if (list == NULL || pos < 0)
    {
        printf("SeqList_Get fail ret=", ret = -1);
        return ret = -1;
    }
    TSeqList* tList = list;
    if (tList->node == NULL) {
        printf("SeqList_Get fail tList->node = null,ret=", ret = -1);
        return ret = -1;
    }
    return tList->node[pos];
}

SeqListNode* SeqList_Delete(SeqList* list, int pos) {
    int ret = 0;
    if (list == NULL || pos < 0)
    {
        printf("SeqList_Delete fail ret=", ret = -1);
        return ret = -1;
    }
    TSeqList* tList = list;
    if (tList->node == NULL) {
        printf("SeqList_Delete fail tList->node = null,ret=", ret = -1);
        return ret = -1;
    }

    SeqListNode* node = (SeqListNode*)tList->node[pos];

    for (int i = pos; i < tList->length+1; i++) {
        tList->node[i] = tList->node[i + 1];
    }
    tList->length--;

    return node;
}

test.c

#include 
#include
#include 
#include "seqlist.h"

typedef struct _Teacher{
    int age;
    char name[64];
}Teacher;

void main() {
    int ret = 0;
    SeqList* list = NULL;

    Teacher t1, t2, t3, t4, t5;
    t1.age = 10;
    t2.age = 20;
    t3.age = 40;
    t4.age = 50;
    t5.age = 60;

    list = SeqList_Create(10);
    if (list == NULL) {
        printf("SeqList_Create fail ret =%d", ret);
        return;
    }
    else {
        printf("Create success");
    }

    ret = SeqList_Insert(list, (SeqListNode*)&t1, 0);
    ret = SeqList_Insert(list, (SeqListNode*)&t2, 0);
    ret = SeqList_Insert(list, (SeqListNode*)&t3, 0);
    ret = SeqList_Insert(list, (SeqListNode*)&t4, 0);
    ret = SeqList_Insert(list, (SeqListNode*)&t5, 0);

    for (int i = 0; i < SeqList_Length(list); i++) {
        Teacher*temp = (Teacher*)SeqList_Get(list, i);
        if (temp == NULL) {
            return;
        }
        printf("temp->age:%d", temp->age);
    }

    SeqList_Delete(list, 0);
    for (int i = 0; i < SeqList_Length(list); i++) {
        Teacher* temp = (Teacher*)SeqList_Get(list, i);
        if (temp == NULL) {
            return;
        }
        printf("temp2->age:%d", temp->age);
    }
    system("pause");
}

线性表链式存储

test.c

#include 
#include
#include 
#include "seqlist.h"
#include "linklist.h"

typedef struct Teacher{
    LinkListNode node;
    int age;
}Teacher;

void main() {
    LinkList* list = LinkList_Create();
    if (list == NULL) {
        printf("创建链表失败");
        return;
    }
    Teacher t1, t2, t3;
    t1.age = 10;
    t2.age = 20;
    t3.age = 30;

    LinkList_Insert(list, (LinkListNode*)& t1, 0);
    LinkList_Insert(list, (LinkListNode*)& t2, 0);
    LinkList_Insert(list, (LinkListNode*)& t3, 0);
     
    for (int i = 0; i < LinkList_Length(list); i++) {
        Teacher * node = (Teacher*)LinkList_Get(list, i);
        if (node == NULL) {
            continue;
        }
        printf("node.age = %d\n", node->age);
    }

    int length = LinkList_Length(list);
    printf("链表长度为%d\n", length);

    LinkListNode* node = LinkList_Delete(list, 0);
    for (int i = 0; i < LinkList_Length(list); i++) {
        Teacher* node = (Teacher*)LinkList_Get(list, i);
        if (node == NULL) {
            continue;
        }
        printf("node.age = %d\n", node->age);
    }

    LinkList_Destroy(list);
    system("pause");
}

linklist.h

#pragma once
#include 

typedef void LinkList;

typedef struct _tag_LinkListNode {
    struct _tag_LinkListNode* next;
}LinkListNode;

LinkList* LinkList_Create();

void LinkList_Destroy(LinkList* list);

void LinkList_Clear(LinkList* list);

int LinkList_Length(LinkList* list);

int LinkList_Insert(LinkList*list, LinkListNode* node, int pos);

LinkListNode* LinkList_Get(LinkList* list, int pos);

LinkListNode* LinkList_Delete(LinkList* list, int pos);

linklist.c

#include "linklist.h"

typedef struct _tag_LinkList {
    int length;
    LinkListNode header;
}TLinkList;

LinkList* LinkList_Create() {
    TLinkList* tList = (TLinkList*)malloc(sizeof(TLinkList));
    memset(tList, 0, sizeof(TLinkList));
    tList->header.next = NULL;
    tList->length = 0;
    return tList;
}

void LinkList_Destroy(LinkList* list) {
    if (list != NULL) {
        free(list);
        list = NULL;
    }
    return;
}

void LinkList_Clear(LinkList* list) {
    TLinkList* tList = NULL;
    if (list == NULL) {
        return;
    }
    tList = (TLinkList*)list;
    tList->header.next = NULL;
    tList->length = 0;
    return;
}

int LinkList_Length(LinkList* list) {
    TLinkList* tList = NULL;
    if (list == NULL) {
        return;
    }
    tList = (TLinkList*)list;
    return tList->length;
}

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) {
    int ret = 0, i = 0;
    LinkListNode* current = NULL;
    if (list == NULL || node == NULL || pos < 0) {
        return ret = -1;
    }
    TLinkList* tList = list;
    //定义一个指针指向链表的头节点
    current = (LinkListNode*)&(tList->header);
    //将指针移动到pos位置
    for (i = 0; i < pos; i++) {
        current = current->next;
    }

    //插入节点
    node->next = current->next;
    current->next = node;
    tList->length++;
    return 0;
}

LinkListNode* LinkList_Get(LinkList* list, int pos) {
    if (list == NULL || pos < 0) {
        return NULL;
    }
    TLinkList* tList = list;
    LinkListNode* current = (LinkListNode*)&(tList->header);
    for (int i = 0; i < pos; i++) {
        current = current->next;
    }

    return current->next;
}

LinkListNode* LinkList_Delete(LinkList* list, int pos) {
    if (list == NULL || pos < 0) {
        return NULL;
    }
    TLinkList* tList = list;
    LinkListNode* current = &(tList->header);
    for (int i = 0; i < pos; i++) {
        current = current->next;
    }
    LinkListNode* temp = current->next;
    current->next = current->next->next;
    return temp;
}

循环单链表

CircleList.h

#pragma once

typedef void CircleList;

typedef struct _tag_CircleListNode {
    struct _tag_CircleListNode* next;
}CircleListNode;

CircleList* CircleListCreate();

void CircleList_Destroy(CircleList* list);

void CircleList_Clear(CircleList* list);

int CircleList_Length(CircleList* list);

int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);

CircleListNode* CircleList_Get(CircleList* list,int pos);

CircleListNode* CircleList_Delete(CircleList* list, int pos);

CircleListNode* CircleList_Delete_Node(CircleList* list, CircleListNode* node);

CircleListNode* CircleList_Reset(CircleList* list);

CircleListNode* CircleList_Current(CircleList* list);

CircleListNode* CircleList_Next(CircleList* list);

CircleList.c

#include "CircleList.h"
#include 

typedef struct _tag_CircleList {
    CircleListNode header;
    CircleListNode* slider;
    int length;
}TCircleList;

CircleList* CircleListCreate() {
    TCircleList* list = (TCircleList*)malloc(sizeof(TCircleList));
    if (list == NULL) {
        return NULL;
    }
    list->header.next = NULL;
    list->slider = NULL;
    list->length = 0;
    return list;
}

void CircleList_Destroy(CircleList* list) {
    if (list == NULL) {
        return;
    }
    free(list);
}

void CircleList_Clear(CircleList* list) {
    if (list == NULL) {
        return;
    } 
    TCircleList* tList = (TCircleList*)list;
    tList->header.next = NULL;
    tList->length = 0;
    tList->slider = NULL;
    return;
}

int CircleList_Length(CircleList* list) {
    if (list == NULL) {
        return 0;
    }
    TCircleList* tList = (TCircleList*)list;
    return tList->length;
}

int CircleList_Insert(CircleList* list, CircleListNode* node, int pos) {
    
    TCircleList* tList = (TCircleList*)list;
    if (tList == NULL || node == NULL || pos<0) {
        return -1;
    }
    //CircleListNode* current = (CircleListNode*)(&(tList->header));
    CircleListNode* current = (CircleListNode*)tList;
    for (int i = 0; i < pos; i++) {
        current = current->next;
    }
    node->next = current->next;
    current->next = node;

    //如果是第一次插入节点
    if (tList->length == 0)
    {
        tList->slider = node;
    }

    tList->length++;

    //如果是头插法插入,current仍然指向头部,
    if (current == (CircleListNode*)tList) {
        CircleListNode*last = CircleList_Get(tList, tList->length - 1);
        last->next = current->next;
    }
    return 0;
}

CircleListNode* CircleList_Get(CircleList* list, int pos) {
    TCircleList* tList = (TCircleList*)list;
    if (tList == NULL || pos < 0) {
        return -1;
    }
    CircleListNode* current = (CircleListNode*)(&(tList->header));
    for (int i = 0; i < pos; i++) {
        current = current->next;
    }
    return current->next;
}

CircleListNode* CircleList_Delete(CircleList* list, int pos) {
    TCircleList* tList = (TCircleList*)list;
    CircleListNode* temp = NULL;
    if (tList == NULL || tList->length == 0|| pos < 0) {
        return -1;
    }
    CircleListNode* last = NULL;
    CircleListNode* current = (CircleListNode*)(&(tList->header));
    for (int i = 0; i < pos; i++) {
        current = current->next;
    }
    //如果删除的是第一个元素(pos == 0)
    if (current == (CircleListNode*)tList) {
        last = (CircleListNode*)CircleList_Get(tList, tList->length - 1);
    }

    //记录要删除的元素
    temp = current->next;
    current->next = temp->next;
    tList->length--;

    //链表不为空
    if (last != NULL) {
        tList->header.next = temp->next;
        last->next = temp->next;
    }

    //如果删除的元素是游标所指的元素
    if (tList->slider = temp) {
        tList->slider = temp->next;
    }

    //如果删除后长度变为0
    if (tList->length == 0) {
        tList->header.next = NULL;
        tList->slider = NULL;
    }
    return temp;
}

CircleListNode* CircleList_Delete_Node(CircleList* list, CircleListNode* node) {

}

CircleListNode* CircleList_Reset(CircleList* list) {

    //邮标重新指向头部位置
    TCircleList* tList = (TCircleList*)list;
    CircleListNode* ret=NULL;
    if (tList == NULL) {
        return -1;
    }
    tList->slider = tList->header.next;
    ret = tList->slider;
    return ret;
}

CircleListNode* CircleList_Current(CircleList* list) {
    TCircleList* tList = (TCircleList*)list;
    if (tList == NULL) {
        return NULL;
    }
    return tList->slider;
}

//把当前位置返回并且游标下移
CircleListNode* CircleList_Next(CircleList* list) {
    TCircleList* tList = (TCircleList*)list;
    CircleListNode* ret = NULL;
    if (tList == NULL || tList->slider == NULL) {
        return NULL;
    }
    ret = tList->slider;
    tList->slider = ret->next;
    return ret;
}

test.c

#include 
#include
#include 
#include "seqlist.h"
#include "linklist.h"
#include "CircleList.h"

struct Value
{
    CircleListNode circleListNode;
    int v;
};

void main() {
    CircleList* list = CircleListCreate();
    struct Value v1;
    struct Value v2;
    struct Value v3;
    struct Value v4;
    struct Value v5;
    struct Value v6;

    v1.v = 1;
    v2.v = 2;
    v3.v = 3;
    v4.v = 4;
    v5.v = 5;
    v6.v = 6;
    printf("开始插入元素\n");
    CircleList_Insert(list, &v1,0);
    CircleList_Insert(list, &v2, 0);
    CircleList_Insert(list, &v3, 0);
    CircleList_Insert(list, &v4, 0);
    CircleList_Insert(list, &v5, 0);
    CircleList_Insert(list, &v6, 0);

    for (int i = 0; i < 2 * CircleList_Length(list); i++) {
        struct Value* v = CircleList_Get(list, i);
        printf("打印元素:%d\n", v->v);
    }

    while (CircleList_Length(list) > 0) {
        struct Value* v = CircleList_Delete(list, 0);
        printf("删除元素:%d\n", v->v);
    }

    printf("\n");

    printf("销毁\n");
    CircleList_Destroy(list);

    printf("完成\n");
    system("pause");
}


typedef struct Teacher {
    LinkListNode node;
    int age;
}Teacher;

void main2() {
    LinkList* list = LinkList_Create();
    if (list == NULL) {
        printf("创建链表失败");
        return;
    }
    Teacher t1, t2, t3;
    t1.age = 10;
    t2.age = 20;
    t3.age = 30;

    LinkList_Insert(list, (LinkListNode*)& t1, 0);
    LinkList_Insert(list, (LinkListNode*)& t2, 0);
    LinkList_Insert(list, (LinkListNode*)& t3, 0);

    for (int i = 0; i < LinkList_Length(list); i++) {
        Teacher* node = (Teacher*)LinkList_Get(list, i);
        if (node == NULL) {
            continue;
        }
        printf("node.age = %d\n", node->age);
    }

    int length = LinkList_Length(list);
    printf("链表长度为%d\n", length);

    LinkListNode* node = LinkList_Delete(list, 0);
    for (int i = 0; i < LinkList_Length(list); i++) {
        Teacher* node = (Teacher*)LinkList_Get(list, i);
        if (node == NULL) {
            continue;
        }
        printf("node.age = %d\n", node->age);
    }

    LinkList_Destroy(list);
    system("pause");
}

你可能感兴趣的:(16C++ 数据结构)