创建单向动态链表、插入链表、删除链表
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;
}
#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;
}
相关文章推荐
- 单向链表的创建 删除 插入
- [转]C语言之单向链表的创建插入删除等功能
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- 单向链表小练习--》创建链表头,添加删除链表节点,释放链表内存,选择插入数据
- c++之链表篇1:单向链表的创建,打印,删除,插入,销毁等基本操作
- 单向链表的相关操作(创建,遍历,插入,删除,逆置)
- 单向链表的创建、遍历、求长、判存、判空、插入、删除、查找(按位置或元素)、合并
- (C++版)链表(一)——实现单向链表创建、插入、删除等相关操作
- 单向链表创建、插入、删除
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- C下的链表的静态,动态创建,删除,插入
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- 单向链表的基本操作-创建、插入、删除
- 单向循环链表创建、遍历、插入、删除、查找(按位置,按元素值)、清空、销毁
- 用c++实现单向链表的创建,插入和删除
- C语言单向链表的创建、释放、插入、删除、翻转操作练习
- 实现单向循环链表的创建、测长、打印、插入、删除及逆置
- 线性表之单向链表的创建、插入、删除和清除
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)