小程序 [链表]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#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;
        }
    }
}
C语言链表
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值