c语言之静态链表

c语言之静态链表_第1张图片

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

#include 
#include 
#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//先将内存初始化 
        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; 
    }
}

你可能感兴趣的:(c语言学习,数据结构学习,c语言静态链表)