09btree

09btree/btree.c

#include <stdio.h>
#include "btree.h"
#include "queue.h"

static void bnode_init(struct btree_info *info,
        struct bnode_info *bnode)
{
    bnode->parent = NULL;
    bnode->lchild = NULL;
    bnode->rchild = NULL;
}

static void btree_add(struct btree_info *info,
        struct bnode_info *bnode,
        int (*cmp)(struct bnode_info *,
            struct bnode_info *)) 
{
    bnode_init(info, bnode);

    struct bnode_info *cur = info->root;
    struct bnode_info **pparent = &info->root;

    while (*pparent) {
        if (cmp(bnode, cur) < 0) {
            pparent = &cur->lchild;
        } else {
            pparent = &cur->rchild;
        }   

        if (*pparent) {
            cur = *pparent;
        }   
    }   

    *pparent = bnode;
    bnode->parent = cur;
}


09btree/Makefile

SRCS := btree.c
SUBDIR := 

$(BUILT_IN): $(SRCS:.c=.o) $(SUBDIR)
    $(LD) $(LDFLAGS) -r -o $@ $(SRCS:.c=.o) $(SUBDIR:=/$(BUILT_IN))

$(SUBDIR):
    $(MAKE) -C $@

$(SRCS:.c=.o):
    $(CC) $(CFLAGS) -c $<

$(DEP): $(SRCS)
    $(CC) $(CFLAGS) -MM $(SRCS) >$@
    sed -i "s/: / $@: /g" $@

sinclude $(DEP)

.PHONY: clean $(SUBDIR)

clean:
    for dir in $(SUBDIR); do \
        $(MAKE) -C $$dir clean; \
    done
    $(RM) $(SRCS:.c=.o) $(BUILT_IN) $(DEP)


09btree/include/btree.h

struct bnode_info {
    struct bnode_info *parent;
    struct bnode_info *lchild;
    struct bnode_info *rchild;
};

struct btree_info {
    struct bnode_info *root;
    void (*bnode_init)(struct btree_info *,
            struct bnode_info *);
    void (*add)(struct btree_info *,
            struct bnode_info *bnode,
            int (*cmp)(struct bnode_info *,
                struct bnode_info *));
    void (*preorder)(struct btree_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));
    void (*inorder)(struct btree_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));
    void (*postorder)(struct btree_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));
    void (*levelorder)(struct btree_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));
    void (*reverse)(struct btree_info *); 
    void (*del)(struct btree_info *,
            struct bnode_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));


 

    struct bnode_info *(*search)(struct btree_info *,
            struct bnode_info *key,
            int (*cmp)(struct bnode_info *,
                struct bnode_info *));
};

void btree_init(struct btree_info *);
void btree_destroy(struct btree_info *,
        void (*)(struct btree_info *,
            struct bnode_info *));

#define offsetof(type, member) \
    ( (size_t)(&((type*)0)->member) )

#define container_of(ptr, type, member) \
    ({const typeof(((type*)0)->member) *__mptr = ptr; \
      (type *)((char*)ptr - offsetof(type, member));})


 


09btree/include/list.h

struct node_info {
    struct node_info *prev;
    struct node_info *next;
    char priv[];
};

struct list_info {
    struct node_info *head;
    void (*add)(struct list_info *,
            const void *data_entry,
            size_t data_size);
    void (*add_tail)(struct list_info *,
            const void *data_entry,
            size_t data_size);
    void (*del)(struct list_info *,
            struct node_info *,
            size_t data_size);
};

#define list_for_each(cur, head) \
    for (cur = (head)->next; \
        (cur) != (head); \
        cur = (cur)->next)

#define list_for_each_safe(cur, tmp, head) \
    for (cur = (head)->next, tmp = (cur)->next; \
        (cur) != (head); \
        cur = tmp, tmp = (tmp)->next)

#define ENTRY(node, type) ((type*)(node->priv))

void list_init(struct list_info*);
void list_destroy(struct list_info*);


09btree/include/queue.h

#include "list.h"

struct queue_info {
    struct list_info list;
    void (*push)(struct queue_info *,
            const void *data_entry,
            size_t data_size);
    int (*pop)(struct queue_info *,
            void *data_entry,
            size_t data_size);
    int (*top)(struct queue_info *,
            void *data_entry,
            size_t data_size);
    int (*isempty)(struct queue_info *); 
};

void queue_init(struct queue_info *); 
void queue_destroy(struct queue_info *); 
~                                                


09btree/main/test.c

#include <stdio.h>
#include <stdlib.h>
#include "btree.h"

struct node_info {
    ssize_t data;
    struct bnode_info bnode;
};

static int cmp(struct bnode_info *a, struct bnode_info *b)
{
    struct node_info *pa = container_of(a, struct node_info, bnode);
    struct node_info *pb = container_of(b, struct node_info, bnode);

    return pa->data - pb->data;
}

static void print_node(struct btree_info *info,
        struct bnode_info *bnode)
{
    struct node_info *ptr = container_of(bnode, struct node_info, bnode);
    printf("%ld ", ptr->data);
}

static void m_free(struct btree_info *info,
        struct bnode_info *bnode)
{
    info->bnode_init(info, bnode);
    free(container_of(bnode, struct node_info, bnode));
}


 

int main()
{
    struct btree_info btree;
    btree_init(&btree);

    struct node_info *cur = NULL;

    ssize_t s[] = {10, 15, 2, 6, 7, 3, 8, 5, 2, 0, -2, 6};

    size_t i = 0;
    for (i = 0; i < sizeof(s) / sizeof(ssize_t); ++i) {
        cur = (struct node_info *)malloc(sizeof(struct node_info));
        cur->data = s[i];
        btree.add(&btree, &cur->bnode, cmp);
    }

    struct node_info key = {6};
    struct bnode_info *search_ret = NULL;


 

    printf("del node %ld\n", key.data);
    if (search_ret = btree.search(&btree, &key.bnode, cmp)) {
        btree.del(&btree, search_ret, m_free);
    }

    printf("preorder\n");
    btree.preorder(&btree, print_node);
    printf("\n");
    printf("inorder\n");
    btree.inorder(&btree, print_node);
    printf("\n");
    printf("postorder\n");
    btree.postorder(&btree, print_node);
    printf("\n");
    printf("levelorder\n");
    btree.levelorder(&btree, print_node);
    printf("\n");

    btree_destroy(&btree, m_free);

    return 0;
}


09btree/main/Makefile

SRCS := test.c
SUBDIR := 

$(BUILT_IN): $(SRCS:.c=.o) $(SUBDIR)
    $(LD) $(LDFLAGS) -r -o $@ $(SRCS:.c=.o) $(SUBDIR:=/$(BUILT_IN))

$(SUBDIR):
    $(MAKE) -C $@

$(SRCS:.c=.o):
    $(CC) $(CFLAGS) -c $<

$(DEP): $(SRCS)
    $(CC) $(CFLAGS) -MM $(SRCS) >$@
    sed -i "s/: / $@: /g" $@

sinclude $(DEP)

.PHONY: clean $(SUBDIR)

clean:
    for dir in $(SUBDIR); do \
        $(MAKE) -C $$dir clean; \
    done
    $(RM) $(SRCS:.c=.o) $(BUILT_IN) $(DEP)


09btree/queue/list.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"


static void __list_add(struct node_info *prev,
        struct node_info *next,
        const void *data_entry,
        size_t data_size)
{
    struct node_info *node = (struct node_info *)malloc(sizeof(struct node_info) + data_size);
    memcpy(node->priv, data_entry, data_size);

    node->prev = prev;
    node->next = next;
    prev->next = node;
    next->prev = node;
}


 

static void list_add(struct list_info *info,
        const void *data_entry, size_t data_size)
{
    __list_add(info->head, info->head->next,
            data_entry, data_size);
}

static void list_add_tail(struct list_info *info,
        const void *data_entry, size_t data_size)
{
    __list_add(info->head->prev, info->head,
            data_entry, data_size);
}


 

static void list_del(struct list_info *info,
        struct node_info *node,
        size_t data_size)
{
    node->prev->next = node->next;
    node->next->prev = node->prev;
    node->prev = node;
    node->next = node;

    if (data_size) {
        memset(node->priv, 0, data_size);
    }
    free(node);
}

void list_init(struct list_info *info)
{
    info->head = (struct node_info *)malloc(sizeof(struct node_info));
    info->head->prev = info->head;
    info->head->next = info->head;

    info->add = list_add;
    info->add_tail = list_add_tail;
    info->del = list_del;
}

void list_destroy(struct list_info *info)
{
    struct node_info *cur = info->head->next;

    for (; cur != info->head; cur = info->head->next) {
        list_del(info, cur, 0);
    }

    free(info->head);
}


09btree/queue/queue.c

#include <stdio.h>
#include <string.h>
#include "queue.h"


static void queue_push(struct queue_info *info,
        const void *data_entry,
        size_t data_size)
{
    info->list.add_tail(&info->list, data_entry, data_size);
}

static int queue_isempty(struct queue_info *info)
{
    return info->list.head->next == info->list.head;
}

static int queue_top(struct queue_info *info,
        void *data_entry,
        size_t data_size)
{
    if (queue_isempty(info)) {
        return -1; 
    }   

    if (data_entry) {
        memcpy(data_entry, info->list.head->next->priv, data_size);
    }   
    return 0;
}


 

static int queue_pop(struct queue_info *info,
        void *data_entry,
        size_t data_size)
{
    if (queue_top(info, data_entry, data_size) < 0) {
        return -1; 
    }

    //?..绗.?涓..?..?
    info->list.del(&info->list, info->list.head->next, data_size);
    return 0;
}

void queue_init(struct queue_info *info)
{
    list_init(&info->list);
    info->push = queue_push;
    info->pop = queue_pop;
    info->top = queue_top;
    info->isempty = queue_isempty;
}

void queue_destroy(struct queue_info *info)
{
    list_destroy(&info->list);
}


09btree/queue/Makefile

SRCS := list.c queue.c
SUBDIR := 

$(BUILT_IN): $(SRCS:.c=.o) $(SUBDIR)
    $(LD) $(LDFLAGS) -r -o $@ $(SRCS:.c=.o) $(SUBDIR:=/$(BUILT_IN))

$(SUBDIR):
    $(MAKE) -C $@

$(SRCS:.c=.o):
    $(CC) $(CFLAGS) -c $<

$(DEP): $(SRCS)
    $(CC) $(CFLAGS) -MM $(SRCS) >$@
    sed -i "s/: / $@: /g" $@

sinclude $(DEP)

.PHONY: clean $(SUBDIR)

clean:
    for dir in $(SUBDIR); do \
        $(MAKE) -C $$dir clean; \
    done
    $(RM) $(SRCS:.c=.o) $(BUILT_IN) $(DEP)



 

内容概要:本文详细介绍了PMSM(永磁同步电机)的仿真研究及其两种关键控制方法:三电平SVPWM矢量控制和双环矢量控制。首先阐述了PMSM在现代电机驱动系统中的重要地位及其广泛的应用领域,如电动汽车、机器人和风力发电等。接着讨论了PMSM仿真的重要性,包括电气特性、机械特性和热特性等方面的考量。然后深入探讨了三电平SVPWM矢量控制技术的工作原理及其对电机性能的提升效果,如提高运行效率和减少谐波失真。随后介绍了PMSM双环矢量控制的具体实现方式,即内环电流控制和外环速度控制相结合的方法,强调了这种方法在提高电机动态性能和稳定性方面的优势。最后对比了传统三电平控制方法和双环矢量控制方法的特点,指出了各自的优势和应用场景。 适合人群:从事电机控制系统研究的技术人员、高校相关专业师生、对电机控制感兴趣的工程技术人员。 使用场景及目标:适用于需要深入了解PMSM控制技术和仿真实现的研究项目和技术开发。目标是帮助读者掌握PMSM的仿真建模方法,理解并应用三电平SVPWM和双环矢量控制技术,以优化电机性能。 其他说明:本文不仅提供了理论分析,还通过MATLAB进行了详细的仿真演示,使读者能够直观地看到不同控制方法的效果。这对于实际工程项目的设计和优化具有重要的指导意义。
/* Navicat Premium Data Transfer Source Server : 本地小皮8.0 Source Server Type : MySQL Source Server Version : 80012 Source Host : localhost:3306 Source Schema : house_sell Target Server Type : MySQL Target Server Version : 80012 File Encoding : 65001 Date: 19/09/2024 16:57:17 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for a_customer_lease -- ---------------------------- DROP TABLE IF EXISTS `a_customer_lease`; CREATE TABLE `a_customer_lease` ( `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NOT NULL, `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `create_time` datetime(6) NULL DEFAULT NULL, `del_flag` int(11) NOT NULL, `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `update_time` datetime(6) NULL DEFAULT NULL, `house_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `seller_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `status` int(11) NOT NULL, `user_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `user_money` decimal(19, 2) NULL DEFAULT NULL, `user_remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_croatian_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of a_customer_lease -- ---------------------------- INSERT INTO `a_customer_lease` VALUES '1588813619368431616', '17859654125', '2022-11-05 16:41:00.246000', 0, '17859654121', '2022-11-05 16:55:28.977000', '1588808881004482560', '1464772465946398721', 1, '1464764315201572865', 1200.00, '我要租你的房子!'); -- ---------------------------- -- Table structure for a_customer_sell -- ---------------------------- DROISTS `a_customer_sell`; CREATE TABLE `a
03-22
<think>好的,用户现在遇到了另一个问题,需要帮忙检查并修正SQL脚本的错误。首先,我需要仔细阅读用户提供的SQL代码,找出其中的问题所在。 用户提供的SQL代码看起来是Navicat生成的数据库结构脚本。首先,注意到在创建表`a_customer_sell`的部分,代码突然中断了。用户提供的脚本在`a_customer_lease`表的创建和插入记录之后,开始处理`a_customer_sell`表,但代码不完整。具体来说,在`a_customer_sell`的CREATE TABLE语句之前,用户写的是“DROISTS `a_customer_sell`;”,这明显是一个拼写错误,正确的应该是“DROP TABLE IF EXISTS `a_customer_sell`;”。这个拼写错误导致SQL语法错误,无法正确执行。 接下来,用户可能在创建`a_customer_sell`表时,结构定义不完整或者有语法错误。例如,CREATE TABLE语句是否正确定义了所有字段,是否缺少右括号,或者字符集设置是否正确等。需要检查每个部分是否符合MySQL的语法规范。 此外,还需要检查其他潜在的问题,比如表名、字段名是否正确,是否有缺失的分号,或者是否遗漏了某些部分。例如,在用户提供的代码中,`a_customer_sell`的创建语句可能没有完成,导致后续的插入记录或其他操作无法执行。 可能用户在使用Navicat导出脚本时,由于某些原因导致脚本不完整或出现拼写错误。这时候需要逐步检查每个SQL语句,特别是注意那些明显的拼写错误或语法错误,比如“DROISTS”应该是“DROP TABLE IF EXISTS”。 另外,还要确认用户使用的MySQL版本是否与脚本中的设置兼容,比如ENGINE=InnoDB,字符集和校对规则是否正确。例如,`CHARACTER SET utf8 COLLATE utf8_croatian_ci`是否正确,或者是否有更推荐的字符集,比如utf8mb4。 总结问题,用户的主要错误在于拼写错误导致DROP TABLE语句无法正确执行,从而使得后续的CREATE TABLE语句可能无法正确创建表结构。修正拼写错误后,还需检查整个SQL脚本的结构是否完整,确保每个表都有正确的定义和结束符。</think>您的 SQL 脚本存在两处关键错误,主要集中在 `a_customer_sell` 表的创建部分。以下是具体分析和修正方案: --- ### **错误一:语法错误** ```sql DROISTS `a_customer_sell`; -- ❌ 错误写法 CREATE TABLE `a_customer_sell` ( ``` - **错误原因**:`DROISTS` 是拼写错误,正确语法应为 `DROP TABLE IF EXISTS` - **修正结果**: ```sql DROP TABLE IF EXISTS `a_customer_sell`; -- ✅ 正确写法 CREATE TABLE `a_customer_sell` ( -- 字段定义... ) ``` --- ### **错误二:表结构不完整** ```sql CREATE TABLE `a_customer_sell` ( -- ❌ 缺少字段定义和右括号 ``` - **错误现象**:脚本中 `a_customer_sell` 表的字段定义被截断,导致 SQL 无法执行 - **修正建议**:需补充完整表结构(参考 `a_customer_lease` 的格式),例如: ```sql CREATE TABLE `a_customer_sell` ( `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NOT NULL, `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `create_time` datetime(6) NULL DEFAULT NULL, `del_flag` int(11) NOT NULL, `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `update_time` datetime(6) NULL DEFAULT NULL, `house_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `seller_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `status` int(11) NOT NULL, `user_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `user_money` decimal(19, 2) NULL DEFAULT NULL, `user_remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_croatian_ci ROW_FORMAT = Dynamic; ``` --- ### **完整修正后脚本** ```sql -- ---------------------------- -- Table structure for a_customer_sell -- ---------------------------- DROP TABLE IF EXISTS `a_customer_sell`; -- ✅ 修正拼写错误 CREATE TABLE `a_customer_sell` ( `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NOT NULL, `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `create_time` datetime(6) NULL DEFAULT NULL, `del_flag` int(11) NOT NULL, `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `update_time` datetime(6) NULL DEFAULT NULL, `house_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `seller_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `status` int(11) NOT NULL, `user_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, `user_money` decimal(19, 2) NULL DEFAULT NULL, `user_remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_croatian_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_croatian_ci ROW_FORMAT = Dynamic; ``` --- ### **其他建议** 1. **字符集统一性**:建议使用 `utf8mb4` 代替 `utf8`(MySQL 8.0 默认字符集) 2. **时间戳字段**:可考虑使用 `CURRENT_TIMESTAMP` 自动填充时间 3. **外键约束**:如果存在关联表(如 `house_id` 对应房屋表),建议添加外键约束 ```sql -- 示例:改进后的字段定义 `create_time` datetime(6) DEFAULT CURRENT_TIMESTAMP(6), `update_time` datetime(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值