c语言之静态链表

这里写图片描述

/**
    静态循环链表 
    动态是malloc申请节点来存放数据再链接
    静态是用一个元素为节点类型的数组来当存储节点的内存 当要使用的时候就在里面找可以使用的元素地址进行链接存储数据 
**/ 

#include <stdio.h>
#include <stdlib.h>
#define linksizemax 4

typedef struct slinknode
{
    int data;
    struct slinknode *next;
}slinknode;


slinknode list[linksizemax];
slinknode *listadr;//表示的是链表的第一个结点 
typedef unsigned int uint;
uint cnt = 0;

void Initlist(void);
uint Delete(uint data); 
slinknode * findAdr(void);
uint Insert(uint data);
void pr(slinknode * ptr);

int main()
{
    Initlist();
    Insert(1);
    Insert(2);
    Insert(3);
    Insert(4);
    pr(listadr);
    printf("____________________\n");
    Delete(4);
    pr(listadr);
    printf("____________________\n");
    Delete(3);
    pr(listadr);

    return 0;
}


void Initlist(void)
{
    uint i;
    for(i=0; i<linksizemax; i++){//先将内存初始化 
        list[i].next = NULL;
    }
    listadr = NULL;
    cnt = 0; 

} 

slinknode * findAdr(void)
{
    uint i;

    if(cnt < linksizemax)
    {
        for(i = 0; i < linksizemax; i++)
        {
            if(list[i].next == NULL)
            {
                return &list[i];//在数组里面寻找空的地方,来存放。 
            }   
        } 
    }
    return NULL; 

}

uint Insert(uint data)
{
    slinknode *tempptr = NULL;

    tempptr = findAdr();

    if(tempptr != NULL)
    {
        tempptr->data = data;

        if(!cnt)//如果是首元素 
        {
            tempptr->next = tempptr;
            listadr = tempptr;
        }
        else
        {

            tempptr->next = listadr->next;
            listadr->next = tempptr;
            /* 
            这样不行  这样的最后一个节点的next一直都是指向第一次插入的节点(也就是本身) 不会变化 
            tempptr->next = listadr;
            listadr = tempptr;
            */
        }
        cnt++;
        return 1;
    }
    return 0;
} 

uint Delete(uint data)
{
    uint i;
    slinknode *temp = NULL;
    temp = listadr;
    if(cnt == 1 && listadr->data == data)//判断当只有一个元素时要删除的情况 
    {
        listadr = NULL;
        cnt--;
        return 1;
    }
    for(i = 0; i < cnt; i++)
    {
        if(temp->next->data == data)
        {
            if(temp->next == listadr)//如果要删除的是第一个节点那么要对listadr移动 
            {
                listadr = temp->next->next; 
            }
            temp->next = temp->next->next;
            cnt--;
            return 1;
        }
        else
        {
            temp = temp->next;
        }
    } 
    return 0;
}

void pr(slinknode * ptr)
{
    uint i;
    slinknode * p = ptr;
    for(i = 0; i < cnt; i++)
    {
        printf("%d\n", p->data);
        p = p->next; 
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值