您的位置:首页 > 其它

创建单向动态链表、插入链表、删除链表

2010-10-15 21:45 302 查看
今天学习了链表,并用哑结点(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐