数据结构-C语言链表模拟

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
//线性链表模拟

/*

只是单纯的模拟练习一下,没有检查健壮性,这可能是一个漏洞百出的程序。

*/

typedef struct Node
{
    int data;
    struct Node * pNode;
}NODE,* PNODE;


PNODE create_list(int/*链表的长度,链表的值默认为0*/);//创建一个链表

void show_list(PNODE/*链表头指针地址*/);//遍历一个链表并打印输出

bool is_empty(PNODE/*链表头指针地址*/);//判断链表是否为空

bool insert_val(PNODE/*链表头指针地址*/,int/*值*/);//给链表赋值

int len_list(PNODE/*链表头指针地址*/);//判断链表的长度

bool del_val(PNODE/*链表头指针地址*/,int/*要删除的值*/,int * /*将删除的值返回给此地址指向的变量*/);//删除某一个值

void sort_list(PNODE/*链表头指针地址*/);//链表排序

void sort_list2(PNODE/*链表头指针地址*/);//链表排序2

bool expand_list(PNODE/*链表头指针地址*/,int/*索引位置*/,int/*要插入的值*/);//在链表的指定位置扩充一个链表元素。

int get_val(PNODE/*链表头指针地址*/,int/*索引位置*/);//获取特定索引位置的链表的值。

int main(void)//测试链表
{
    int pval = NULL;
    PNODE p = create_list(6);
    insert_val(p,35);
    insert_val(p,22);
    insert_val(p,67);
    insert_val(p,89);
    insert_val(p,65);
    insert_val(p,90);
    expand_list(p,6,11);
    //sort_list2(p);
    show_list(p);
    printf("长度:%d\n",len_list(p));
    printf("%d\n",get_val(p,2));
    return 0;
}

PNODE create_list(int len)//创建一个链表
{
    PNODE pn = NULL;
    PNODE pt = NULL;
    int i;

    pn = (PNODE)malloc(sizeof(NODE));
    pt = pn;
    for(i=0;i<len;i++)
    {
        pt->pNode = (PNODE)malloc(sizeof(NODE));
        pt = pt->pNode;
        pt->data = NULL;
        pt->pNode = NULL;
        
    }
    
    return pn;
}

void show_list(PNODE Pnode)//遍历一个链表并打印输出
{
    PNODE t;
    t = Pnode->pNode;
    while(NULL != t)
    {
        printf("%d\n",t->data);
        t = t->pNode;
    }
}

bool is_empty(PNODE pn)//判断链表是否为空
{
    if(NULL == pn || NULL == pn->pNode) return true;
    return false;
}

int len_list(PNODE pn)//判断链表的长度
{
    int cnt=0;
    pn = pn->pNode;
    while(NULL!=pn)
    {
        cnt++;
        pn = pn->pNode;
    }

    return cnt;
}


bool insert_val(PNODE pn,int val)//给链表赋值
{
    int len = len_list(pn);
    pn = pn->pNode;
    if(pn->data==NULL)
    {
        pn->data = val;
        return true;
    }
    else
    {
        int i = 0;
        while(NULL != pn->data && NULL != pn->pNode)
        {
            i++;
            
            pn = pn->pNode;
        }
        if(NULL == pn->data)
        {
            pn->data = val;
            return true;
        }
    }
    return false;
}

bool del_val(PNODE pn,int val,int * pdel_val)//删除某一个值
{
    PNODE pt = pn;
    pn = pn->pNode;
    while(NULL!=pn->data&&NULL!=pn->pNode)
    {
        if(pn->data==val)
        {
            *pdel_val = pn->data;
            break;
        }
        pt = pn;
        pn = pn->pNode;
    }
    if(pn->pNode==NULL&& *pdel_val == NULL) return false;
    pt->pNode = pn->pNode;
    free(pn);
    return true;
}

void sort_list(PNODE pn)//链表排序
{
    int temp;
    PNODE pt = NULL;
    pn = pn->pNode;
    pt = pn->pNode;
    while(pn->pNode!=NULL&&pn->pNode->pNode!=NULL)
    {
        pt = pn->pNode;
        while(pt->pNode!=NULL)
        {
            if(pn->data>pt->data)
            {
                temp = pn->data;
                pn->data = pt->data;
                pt->data = temp;
            }
            pt = pt->pNode;
        }
        pn = pn->pNode;
    }
}

void sort_list2(PNODE pn)//链表排序2
{
    PNODE p1 = NULL,p2=NULL;
    int pt;
    for(p1 = pn->pNode;p1->pNode!=NULL;p1=p1->pNode)
    {
        for(p2=p1->pNode;p2->pNode!=NULL&&p2!=NULL;p2=p2->pNode)
        {
            if(p1->data>p2->data)
            {
                pt=p1->data;
                p1->data=p2->data;
                p2->data=pt;
            }
        }
    }


}

bool expand_list(PNODE pn,int index,int val)//在链表的指定位置扩充一个链表元素。
{
    int i = 1;
    PNODE p1 = pn;
    
    if(index>0&&index<=len_list(pn))
    {    
        for(p1 = pn->pNode;i<index&&p1!=NULL;p1=p1->pNode,pn=pn->pNode) i++;
        pn->pNode = (PNODE)malloc(sizeof(NODE));
        pn->pNode->data = val;
        pn->pNode->pNode = p1;
        return true;
    }
    return false;
    

}

int get_val(PNODE pn,int index)//获取特定索引位置的链表的值。
{
    int i = 1;
    PNODE p1 = pn;
    if(index>0&&index<=len_list(pn))
    {    
        for(p1 = pn->pNode;i<index&&p1!=NULL;p1=p1->pNode,pn=pn->pNode) i++;
        return p1->data;
    }
    printf("没有找到指定的值。\n");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值