一个双链表的C实现

最近想学习下数据结构方面的知识,于是上网找了些双链表的实现,资料很多,但是,结果发现基本是不能用的,有些甚至编译不过去

后来,我就在一个别人写的基础上,重新修改了一遍,自己测试是好的


linux + vim + gcc



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

typedef struct MyNode {
    int data;
    struct MyNode *left;
    struct MyNode *right;
} MyNode, *pmyNode;

pmyNode CreateNode(int data)
{
    pmyNode pnode = (pmyNode)malloc(sizeof(MyNode));
    pnode->data = data;
    pnode->left = pnode->right = pnode;
    return pnode;
}

pmyNode CreateList(int head)
{
    pmyNode pnode = (pmyNode)malloc(sizeof(MyNode));
    pnode->data = head;
    pnode->left = pnode->right = pnode;
    return pnode;
}

pmyNode InsertNode(pmyNode node, int data)
{
    pmyNode pnode = CreateNode(data);
    pmyNode ptmp = node->left;

    node->left->right = pnode;
    pnode->right = node;

    node->left = pnode;
    pnode->left = ptmp;

    return node;
}

pmyNode FindNode(pmyNode node, int data)
{
    pmyNode pnode = node->right;
    while (pnode  != node) {
        if(pnode->data == data) return pnode;
        pnode = pnode->right;
    }

    return NULL;
}

pmyNode DelectNode(pmyNode node, int data)
{
    pmyNode ptmp;
    pmyNode pnode = FindNode(node, data);

    if(NULL == pnode) return NULL;

    ptmp = pnode->left;
    ptmp->right = pnode->right;
    pnode->right->left = ptmp;

    free(pnode);

    return node;
}

int GetLenght(pmyNode node)
{
    int nCount = 0;
    pmyNode pnode = node->right;

    while (pnode != node) {
        nCount++;
        pnode = pnode->right;
    }

    return nCount;
}

void PrintList(pmyNode node)
{
    pmyNode pnode;

    if(NULL == node)    return;

    pnode = node->right;
    while (pnode != node && pnode != NULL) {
        printf("%d  ", pnode->data);
        pnode = pnode->right;
    }
    printf("\n");
}

void ReverPrintList(pmyNode node)
{
    pmyNode pnode;

    if(NULL == node)    return;

    pnode = node->left;
    while (pnode != node) {
        printf("%d  ", pnode->data);
        pnode = pnode->left;
    }
    printf("\n");
}

void DelectList(pmyNode node)
{
    if(NULL == node)    return;

    pmyNode pnode = node->right;
    pmyNode ptmp;

    while (pnode != node) {
        ptmp = pnode;
        pnode = pnode->right;
        free(ptmp);
    }
    free(node);
}

void ClearList(pmyNode node)
{
    if(NULL == node)    return;

    pmyNode pnode = node->right;
    pmyNode ptmp;

    while (pnode != node) {
        ptmp = pnode;
        pnode = pnode->right;
        free(ptmp);
    }

    node->right = node->left = node;
}

int main(void)
{
    int choose;
    int data;
    int flag = 1;
    pmyNode pnode;
    pmyNode list = CreateList(0);

    while (flag) {
        printf("======== Main Menu ========\n");
        printf("1   InsertNode\n");
        printf("2   DelectNode\n");
        printf("3   FindNode\n");
        printf("4   GetLenght\n");
        printf("5   PrintList\n");
        printf("6   ReverPrintList\n");
        printf("7   ClearList\n");
        printf("0   quit\n\n");
        printf("===========================\n");

        scanf("%d", &choose);

        switch(choose) {
            case 1:
                printf("Input the data to insert: ");
                scanf("%d", &data);
                list = InsertNode(list, data);
                break;
            case 2:
                printf("Input the data to delete: ");
                scanf("%d", &data);
                DelectNode(list, data);
                break;
            case 3:
                printf("Input the data to find: ");
                scanf("%d", &data);
                pnode = FindNode(list, data);
                if(NULL != pnode)  printf("Find succeed..!!\n");
                else                printf("Find failed..!!\n");
                break;
            case 4:
                printf("The list's length is %d", GetLenght(list));
                break;
            case 5:
                PrintList(list);
                break;
            case 6:
                ReverPrintList(list);
                break;
            case 7:
                ClearList(list);
                break;
            case 0:
                DelectList(list);
                flag = 0;
                break;
            default:
                printf("Please select 0-7 numbers..!!\n");
                break;
        }
        printf("\n");
    }

    return 0;
}

              








概述: 1.任意添加频道/栏目及下级栏目 2.各种频道/栏目菜单显示风格,可显示多级弹出级联菜单 3.多种产品级别显示风格菜单,产品级别可无限级层分类 4.代码全XHTML,方便变换风格,更利于搜索引擎的搜索 5.有各行业风格、韩国风格、欧美风格等提供选择(在官方网选择) 一、界面模板丰富多彩,精美 1. 中网景提供丰富精美的各款式风格的网站界面模板让您选择,让你方便快捷拥有精美而功能强大的网站。 2.有简洁型、豪华型的;韩国风格的;欧美风格的等 3.网站频道菜单和产品菜单都多种菜单风格选择 二、功能模块: 大部分功能模块可以方便快捷地建立多个频道、栏目、二/三级栏目,有以下功能模块: 1.单页内容系统:如公司简介、联系我们的单面内容,后台可图文编排内容,自定义字体、颜色、插图等 2.文章/新闻系统:自由建立新闻栏目、文章栏目。如公司网站常用的技术支持等 3.产品展示系统:产品分类级别无限级分类;多种产品列出显示方式; 4.网上购物/询价系统:可以实现网上商城功能,或询价功能,集成多种在线支付(支付宝、网银在线、财付通等)。 5.下载系统:如驱动和技术文档等文件的下载。 6.会员系统:会员注册、查看修改删除会员资料,会员个人留言,查询订单。可配合中网景论坛用户管理,管理会员。 7.留言系统:管理信息反馈及所有访客的留言,管理员在后台回复留言问题 8.图片展示系统:可用于公司形象图片展示,荣誉证书等栏目 9.人才招聘系统:发布修改招聘信息,人才策略栏目管理,应聘管理。 10.公布网点系统:在地图上分地区显示各地网点公布,如营销网络栏目的信息。 11.友情链接系统:可选择文字或图片链接或下拉菜单显示方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值