c语言练习题 2 3 4

c语言练习题 2 3 4要完整的代码 谢谢了
2025-06-24 02:05:14
推荐回答(1个)
回答1:

#include 
#include 
#include 

#define free_node free
#define __INIT_HEAD__(h) (h = NULL)
#define __CAL_BUFFER_NODE__(ptr, type, member) ((type*)(((unsigned char*)ptr) - ((unsigned int)(&(((type*)NULL)->member)))))

struct entryTool {
    entryTool* _tool;
};
typedef entryTool* entry_list;

struct entry {
    int sId;
    char sNm[20];

    entryTool next;
};

entry* initList(const int, const char*);
void insertEntry_H(entry_list*, entryTool*);                                    // 采用头插法
void insertEntry_T(entry_list*, entryTool*);                                    // 采用尾插法
void removeEntry(entry_list*, entryTool*);

int main(int argc, char* argv[]) {
    entry_list hdptr;
    __INIT_HEAD__(hdptr);

    entry *s = initList(1, "小红");
    insertEntry_H(&hdptr, &(s->next));

    s = initList(2, "小绿");
    insertEntry_T(&hdptr, &(s->next));

    s = initList(3, "小蓝");
    insertEntry_T(&hdptr, &(s->next));

    entryTool* _find = hdptr;
    while (_find) {
        s = __CAL_BUFFER_NODE__(_find, entry, next);
        printf("%d %s\n", s->sId, s->sNm);
        _find = _find->_tool;
    }
    
    while (hdptr) {
        _find = hdptr;
        removeEntry(&hdptr, _find);
        s = __CAL_BUFFER_NODE__(_find, entry, next);
        free_node(s);
        printf("执行删除...\n");
        printf("删除成功...\n");
        printf("\n");
    }

    _find = hdptr;
    while (_find) {
        s = __CAL_BUFFER_NODE__(_find, entry, next);
        printf("%d %s\n", s->sId, s->sNm);
        _find = _find->_tool;
    }

    system("pause");
    return 0;
}

entry* initList(int sId, const char* sNm) {
    entry* newEntry = (struct entry*)malloc(sizeof(struct entry));
    memset(newEntry, 0, sizeof(entry));

    newEntry->sId = sId;
    strcpy_s(newEntry->sNm, sNm);

    return newEntry;
}

void insertEntry_H(entry_list* _hdptr, entryTool* _ndptr) {
    entryTool** hdptr = _hdptr;

    _ndptr->_tool = *hdptr;
    *hdptr = _ndptr;
}

void insertEntry_T(entry_list* _hdptr, entryTool* _ndptr) {
    entryTool** hdptr = _hdptr;

    while ((*hdptr)) {
        hdptr = &(*hdptr)->_tool;
    }
    *hdptr = _ndptr;
    _ndptr->_tool = NULL;
}

void removeEntry(entry_list* _hdptr, entryTool* _ndptr) {
    entryTool** hdptr = _hdptr;

    while ((*hdptr)) {
        if ((*hdptr) == _ndptr) {
            (*hdptr) = _ndptr->_tool;
            _ndptr = NULL;
            return;
        }
    }
}