一直以来都是使用递归来创建和释放链表,非常简单方便,现在遇到一些应用经常产生栈溢出,只能使用非递归了,过去思路不是很清晰,现在小结一下。
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
}*Node;
void Creat(Node h) {
char t=0;
Node p=h;
while(t!=0x0a) {
p->next=(Node)malloc(sizeof(struct LNode));
p=p->next;
p->next=NULL;
scanf("%d%c",&p->data,&t);
}
}
void Delete(Node f) {
do {
Node p=f->next;
f->next = f->next->next;
free(p);
} while(f->next!=NULL);
}
int main() {
Node h=(Node)malloc(sizeof(struct LNode));
Creat(h);
Delete(h);
free(h);
}
检查看看有没有遗漏的结节和漏洞。
//从控制台录入数据
void Creat(Node h)
{
char t=0;Node p=h;
printf("\n创建结点开始:");
while(t!=0x0a){
p->next=(Node)malloc(sizeof(struct LNode));
p=p->next;
p->next=NULL;
scanf("%d%c",&p->data,&t); printf(" 0X%x",p);//创建新结点的位置
}
}
void Delete(Node f) {
printf("\n删除结点开始:\n");
do {
Node p=f->next;//定义保存用于释放的结点
f->next = f->next->next; //修改结节新值
printf(" 0X%x",p);//删除结点的位置
free(p);
} while(f->next!=NULL);
}
int main()
{
Node h=(Node)malloc(sizeof(struct LNode));//创建头结点
Creat(h);//创建录入数据结点
Delete(h);//删除数据结点
free(h);//如果头结点不在复用删除头结点
}
输入数据:55 789 1 13 55 99,结果基本符合预期。
创建结点开始:55 789 1 13 55 99
0X8043d8 0X804420 0X804468 0X8044b0 0X8044f8 0X804540
删除结点开始:
0X8043d8 0X804420 0X804468 0X8044b0 0X8044f8 0X804540
void ListDelete(Node f)
{
do{
Node p=f->next; //p=f->next是临时指针变量temp用于释放
if (p->data%2==0)
{
f->next = f->next->next; //f->next已经赋以新值
free(p);continue; //释放(p)
}
f = f->next;
}while(f->next!=NULL);
}
void print(Node p)
{
do{
p=p->next;
printf("%d ",p->data);
}while(p->next!=NULL);
}
#if 1//#endif
int main()
{
Node h=(Node)malloc(sizeof(struct LNode));//创建头结点
Creat(h);//创建录入数据结点
ListDelete(h);//删除数据结点
printf("\n");print(h);
Delete(h);
free(h);//如果头结点不在复用删除头结点
}
#endif
创建结点开始:12 4 132 55 46 232 789 1 0 58 13 55 99 98
0X7943d8 0X794420 0X794468 0X7944b0 0X7944f8 0X794540 0X794588 0X7945d0 0X794618 0X794660 0X7946a8 0X7946f0 0X794738 0X794780
55 789 1 13 55 99
删除结点开始:
0X7944b0 0X794588 0X7945d0 0X7946a8 0X7946f0 0X794738