今天学习了链表,并用哑结点(dummy node)对链表做了点优化。
#include <stdio.h>
typedef struct S_NODE *Link;//一种约定定义,用typedef允许定义指针时,
//它允许利用此语句后面定义的类型
struct S_NODE //定义一种结构体存放链表元素
{
int x;
Link next;
};
Link Init()
{
Link head;//dummy link
head = (Link)malloc(sizeof(struct S_NODE));
head->next = NULL;
return head;
}
void Add(Link head, Link next)
{
Link t = head;
while (t->next)
t = t->next;
next->next = t->next;
t->next = next;
}
void Del(Link head, int num)
{
Link p1,p2;
p1 = p2 = head; //需要记录被删结构的上一个元素,
//然后把将要被删元素的下一个元素给前一个元素的next,
//就是替代被删元素的位置
while(p1->x != num && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if(num == p1->x)
{ if(p1 == head)
head = p1->next;
else
p2->next = p1->next;
free(p1);
}
else
printf("NO Node!\n");
}
void Free(Link head)
{
Link t;
t = head->next;
while(t->next != NULL)//删除哑结点下一个元素,将下下元素的结点放哑结点内
{
head->next = t->next;
free(t);
t = head->next;
}
free(t); //链表的最后一个元素
free(head); //哑结点
}
int main()
{
Link head, t;
int i;
head = Init();
for (i = 0; i < 50;i++)
{
t = (Link)malloc(sizeof(struct S_NODE));
t->x = i;
Add(head, t);
}
t = head;
for (i = 0; i < 50;i = i+2)
Del(t,i);
t = head->next;
while(t)
{
printf("%d\t", t->x);
t = t->next;
}
Free(head);
printf("END\n");
return 0;
}