/**
静态循环链表
动态是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;
}
}
c语言之静态链表
最新推荐文章于 2023-11-23 16:15:00 发布