#include
<stdio.h>
#define
length 4
static
int
head = -1;
static
int
free = -1;
//
分配和释放对象
static
int
prev[length],key[length],next[length];
void
buildLFree();
int
popLFree ();
void
eatline (
void
);
void
outLink (
void
);
//
输出链表里的值
int
searchLink (
int
x);
//
对双链表进行搜索,查找值为
x
;
int
deleteLink (
int
x);
void
getLFreePoint (
int
x);
//
对双链表里删除的进行回收;
void
insertLink (
int
point,
int
x);
int
main (
void
)
{
int
i, temp, point;
buildLFree();
//
建立自由单链表
for
(i = 0; i < length; i++)
{
printf (
"Please enter the value!\n"
);
while
(scanf (
"%d"
,&temp) != 1)
{
eatline();
printf (
"Please enter the value!\n"
);
}
point = popLFree();
//
插入链表项
insertLink (point, temp);
}
outLink();
point = searchLink (1);
if
(point == -1)
{
printf (
"There is no such value.\n"
);
return
-1;
}
deleteLink (point);
getLFreePoint (point);
outLink ();
point = popLFree ();
insertLink (point, 7);
outLink ();
return
0;
}
void
insertLink (
int
point,
int
x)
{
if
(head == -1)
{
head = point;
prev[point] = -1;
key[point] = x;
next[point] =-1;
}
else
{
//
同时修改下一个值指向这个值
prev[head] = point;
prev[point] = -1;
key[point] = x;
next[point] = head;
head = point;
}
}
void
buildLFree()
{
int
i;
if
(length < 0)
free = -1;
else
free = 0;
for
(i = 0; i < length; i++)
{
if
(i != length - 1)
{
next[i] = i + 1;
}
else
next[i] = -1;
}
}
int
popLFree()
{
int
point;
if
(free == -1)
{
printf (
"There is no space to free"
);
return
-1;
}
else
{
point = free;
free = next[point];
//
让
free
指向下一个自由空间
return
point;
}
}
void
eatline (
void
)
{
while
(getchar () !=
'\n'
)
continue
;
}
void
outLink (
void
)
{
int
temp = head;
while
(temp != -1)
{
printf (
"%d "
, key[temp]);
temp = next[temp];
}
printf (
"\n"
);
}
int
searchLink (
int
x)
{
int
temp = head;
if
( temp == -1)
{
printf (
"There is no any value.\n"
);
return
-1;
}
else
{
while
(temp != -1 && key[temp] != x)
{
temp = next[temp];
}
}
return
temp;
}
int
deleteLink (
int
x)
{
//
想要删除的点前面是有值时
if
(prev[x] != -1)
next[prev[x]] = next[x];
else
head = next[x];
//
想要删除的点后面也是有值时
if
(next[x] != -1)
prev[next[x]] = prev[x];
return
x;
}
void
getLFreePoint (
int
x)
{
key[x] = -1;
next[x] = free;
prev[x] = -1;
free = x;
}