单链表有头结点非递归创建与释放

2024-01-02 12:47:01

单链表创建与释放

一直以来都是使用递归来创建和释放链表,非常简单方便,现在遇到一些应用经常产生栈溢出,只能使用非递归了,过去思路不是很清晰,现在小结一下。

#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

删除链表的data偶数结点

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

文章来源:https://blog.csdn.net/wangsongzxcvbnm/article/details/135333872
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。