文章目录
- 静态链表的基本操作
- 静态链表的结构
- 静态链表的初始化
- 打印静态链表
- 在指定位置插入元素
- 删除指定位置的元素
- 删除指定位置的节点
- 全部代码
- 代码运行测试
静态链表的基本操作
静态链表的结构
typedef struct
{
char date;
int next;
}*NodePtr,Node;
typedef struct
{
NodePtr node;
int *used;//判断地址是否有值,1为有值,0为无值
}*list,lnode;
静态链表的初始化
//静态链表的初始化
list initlist()
{
//temphead为指向整个静态链表的指针
list temphead=(list)malloc(sizeof(lnode)*initlen);
//将静态链表的空间分配给node数组和used数组
temphead->node=(NodePtr)malloc(sizeof(Node)*initlen);
temphead->used =(int*)malloc(sizeof(int)*initlen);
//初始化头节点
temphead->node->date=' ';
temphead->node->next=-1;
temphead->used[0]=1;//头节点不能用来存放数据
int i;
for(i=1;i
temphead->used[i]=0;
}
return temphead;
}
打印静态链表
void printlist(list parahead)
{
int p=0;
while(p!=-1)
{
printf("%c",parahead->node[p].date );
p=parahead->node[p].next;
}
printf("n");
}
在指定位置插入元素
void insert(list parahead,char ch,int position)
{
int i;
int p=0;//从头结点开始
//找到插入位置前一个节点的下标
for(i=1;i
p=parahead->node[p].next;
if(p==-1)
{
printf("插入位置%d大于当前链表的长度n",position);
return;
}
}
//查找当前链表中还有没有没有用到的空间
int q=-1;
for(i=1;i
if(parahead->used[i]==0)
{
q=i;
parahead->used[q]=1;
break;
}
}
//如果没有空余的空间
if(q==-1)
{
printf("链表已满,不能插入元素n");
return;
}
parahead->node[q].date =ch;
parahead->node[q].next=parahead->node[p].next ;
parahead->node[p].next=q;
}
删除指定位置的元素
void deletenode1(list parahead,int position)
{
int i,p=0;
for(i=1;i
p=parahead->node[p].next ;
if(p==-1)
{
printf("删除位置大于当前链表的实际长度n");
return;
}
}
int q=parahead->node[p].next ;
parahead->node[p].next =parahead->node[q].next ;
parahead->used[q]=0;
}
删除指定位置的节点
void deletenode2(list parahead,char ch)
{
int p=0;
while(parahead->node[p].next !=-1&¶head->node[parahead->node[p].next ].date!=ch)
{
p=parahead->node[p].next ;
}
if(parahead->node[p].next ==-1)
{
printf("链表中没有%c,无法删除n",ch);
return;
}
int q=parahead->node[p].next ;
parahead->node[p].next =parahead->node[q].next ;
parahead->used[q]=0;
}
全部代码
#include
#include
#define initlen 20
//静态链表的结构
typedef struct
{
char date;
int next;
}*NodePtr,Node;
typedef struct
{
NodePtr node;
int *used;//判断地址是否有值,1为有值,0为无值
}*list,lnode;
//静态链表的初始化
list initlist()
{
//temphead为指向整个静态链表的指针
list temphead=(list)malloc(sizeof(lnode)*initlen);
//将静态链表的空间分配给node数组和used数组
temphead->node=(NodePtr)malloc(sizeof(Node)*initlen);
temphead->used =(int*)malloc(sizeof(int)*initlen);
//初始化头节点
temphead->node->date=' ';
temphead->node->next=-1;
temphead->used[0]=1;//头节点不能用来存放数据
int i;
for(i=1;i
temphead->used[i]=0;
}
return temphead;
}
//打印静态链表
void printlist(list parahead)
{
int p=0;
while(p!=-1)
{
printf("%c",parahead->node[p].date );
p=parahead->node[p].next;
}
printf("n");
}
//指定位置插入元素
void insert(list parahead,char ch,int position)
{
int i;
int p=0;//从头结点开始
//找到插入位置前一个节点的下标
for(i=1;i
p=parahead->node[p].next;
if(p==-1)
{
printf("插入位置%d大于当前链表的长度n",position);
return;
}
}
//查找当前链表中还有没有没有用到的空间
int q=-1;
for(i=1;i
if(parahead->used[i]==0)
{
q=i;
parahead->used[q]=1;
break;
}
}
//如果没有空余的空间
if(q==-1)
{
printf("链表已满,不能插入元素n");
return;
}
parahead->node[q].date =ch;
parahead->node[q].next=parahead->node[p].next ;
parahead->node[p].next=q;
}
//删除指定位置的元素
void deletenode1(list parahead,int position)
{
int i,p=0;
for(i=1;i
p=parahead->node[p].next ;
if(p==-1)
{
printf("删除位置大于当前链表的实际长度n");
return;
}
}
int q=parahead->node[p].next ;
parahead->node[p].next =parahead->node[q].next ;
parahead->used[q]=0;
}
//删除指定元素的节点
void deletenode2(list parahead,char ch)
{
int p=0;
while(parahead->node[p].next !=-1&¶head->node[parahead->node[p].next ].date!=ch)
{
p=parahead->node[p].next ;
}
if(parahead->node[p].next ==-1)
{
printf("链表中没有%c,无法删除n",ch);
return;
}
int q=parahead->node[p].next ;
parahead->node[p].next =parahead->node[q].next ;
parahead->used[q]=0;
}
void test()
{
// Step 1. Initialize an empty list.
list tempList = initlist();
printlist(tempList);
// Step 2. Add some characters.
insert(tempList, 'H', 1);
insert(tempList, 'e', 2);
insert(tempList, 'l', 3);
insert(tempList, 'l', 4);
insert(tempList, 'o', 5);
printlist(tempList);
// Step 3. Delete some characters (the first occurrence).
printf("Deleting 'e'.rn");
deletenode2(tempList, 'e');
printf("Deleting 'a'.rn");
deletenode2(tempList, 'a');
printf("Deleting 'o'.rn");
deletenode2(tempList, 'o');
printlist(tempList);
printf("删除第2个元素rn");
deletenode1(tempList,2);
printf("删除第1个元素rn");
deletenode1(tempList,1);
printlist(tempList);
insert(tempList, 'x', 1);
printlist(tempList);
}
int main()
{
test();
return 0;
}
代码运行测试