013. 2021-07-08(2)

#include<stdio.h>
#include <stdlib.h>

#include"linkedList.h"


lNode *   headInsert(lNode * first,ElemType x)
{
	//为新节点分配空间
	lNode * p = (lNode *)malloc(sizeof(lNode));
	//lNode node;

	//为p节点赋值
	p->data = x;
	p->next = NULL;


	//把新节点插入到链表中(头插法)
	if(first == NULL)//此时链表为空,p是第一个节点
	{
		return p;
	}
	else//链表原本有节点
	{
		p->next = first;        
		return p;
	}

}


/*
	功能:往链表尾部位置插入一个元素(尾插法)
*/
lNode * tailInsert(lNode * first,ElemType x)
{
	//为新节点分配空间
	lNode * p = (lNode *)malloc(sizeof(lNode));
	//lNode node;

	//为p节点赋值
	p->data = x;
	p->next = NULL;


	//把新节点插入到链表中(尾插法)
	if(first == NULL)//当前链表为空,p节点是第一个节点
	{
		return p;
	}
	else
	{
		//找到最后一个节点
		lNode * last = first;
		while(last->next) // while(last->next != NULL)
		{
			last = last->next;//一个一个往后面找,直到 last->next为 NULL
		}

		last->next = p;

		return first;
	}
	
}


//功能:打印输出一个链表的所有节点数据
void printfLkList(lNode * first)
{
	lNode * p = first;
	while(p)
	{
		printf("%d ",p->data);

		p = p->next;
	}
	printf("\n");
}



int find(lNode * first,ElemType x)
{
	lNode * p = first;
	while(p)
	{
		if(p->data == x)
		{
			return 1;
		}
		p = p->next;
	}

	return 0;
}

void clearLkList(lNode * first)
{
	lNode *p = first;

	while(p)
	{
		//先保存下一个节点
		first = p->next;

		//删除当前节点
		p->next = NULL;//释放一个节点之前,务必把指针域清空
		free(p);

		//让p指向新的first
		p = first;
	}

}


lNode * delete(lNode * first,ElemType x)
{
	//1,找到该节点
	lNode * p = first;
	lNode * r = NULL;
	while(p)
	{
		if(p->data == x)//p就是要删除的节点
		{
			break;
		}
		r = p;//让r保存 p的前驱节点
		p = p->next;
	}

	//2,根据实际情况进行删除操作
	if(p == NULL)//没有找到要删除的节点
	{
		return first;	
	}
	else//找到了要删除的节点
	{
		//分情况
		if(p == first)//要删除的节点是第一个节点
		{
			first = first->next;
			p->next = NULL;
			free(p);
		}
		else if(p->next == NULL)//要删除的节点是最后一个节点
		{
			//不能直接 free(p);因为,倒数第二个节点的指针域还没有清空
			r->next = NULL;
			//p->next = NULL;
			free(p);
		}
		else//删除中间的节点
		{
			r->next = p->next;
			p->next = NULL;
			free(p);
		}

		return first;
	}

}


lNode * deleteAll(lNode * first,ElemType x)
{
	//1,找到该节点
	while(1)
	{
		lNode * p = first;
		lNode * r = NULL;
		while(p)
		{
			if(p->data == x)//p就是要删除的节点
			{
				break;
			}
			r = p;//让r保存 p的前驱节点
			p = p->next;
		}

		//2,根据实际情况进行删除操作
		if(p == NULL)//没有找到要删除的节点
		{
			return first;	
		}
		else//找到了要删除的节点
		{
			//分情况
			if(p == first)//要删除的节点是第一个节点
			{
				first = first->next;
				p->next = NULL;
				free(p);
			}
			else if(p->next == NULL)//要删除的节点是最后一个节点
			{
				//不能直接 free(p);因为,倒数第二个节点的指针域还没有清空
				r->next = NULL;
				//p->next = NULL;
				free(p);
			}
			else//删除中间的节点
			{
				r->next = p->next;
				p->next = NULL;
				free(p);
			}

			//return first;
		}
	}

}


lNode * inversion(lNode * first)
{
	if(first == NULL)
		return NULL;

	//思路: 1,把节点从原链表中取下来
	//		 2,用头插法把该节点插入到新的链表中
	//			循环这两个步骤,直到把所有的节点都处理完


	lNode * newFirst = NULL;//新链表的first
	lNode * p = first;
	
	while(p)
	{
		//1,把p节点从原链表中取下来
		first = first->next;
		p->next = NULL;

		//2,用头插法把该p节点插入到新的链表中
		if(newFirst == NULL)
		{
			newFirst = p;
		}
		else
		{
			p->next = newFirst;
			newFirst = p;
		}
		p = first;
	}

	return newFirst;

}







#ifndef __LINKEDLIST_H__  //如果没有定义 __LINKEDLIST_H__这个宏,那么从下一句到 #endif
							//中间所有的代码都有效
							//如果定义了就无效

#define __LINKEDLIST_H__


typedef int ElemType;//给int类型取一个别名 ElemType
					//一个元素的数据(data)部分的类型
					
struct linkedListnode //链表节点
{
	ElemType data;//数据域 用来保存数据
	struct linkedListnode *next;//存储后继元素的地址 ,指针域
};

typedef struct linkedListnode  lNode;		

/*
	功能:往一个链表中插入一个节点(头插法)
	参数:
		@first:该链表的第一个节点的地址
		@x:要插入的数据
	返回值:
		返回新链表的第一个节点的地址
*/
lNode *   headInsert(lNode * first,ElemType x);


/*
	功能:往链表尾部位置插入一个元素(尾插法)
*/
lNode * tailInsert(lNode * first,ElemType x);




//功能:打印输出一个链表的所有节点数据
void printfLkList(lNode * first);


/*
	功能:查找链表中的某个元素
	参数:
		@first:该链表的第一个节点的地址
		@x:要查找的数据
	返回值:
		查到了返回1
		没查到返回0
*/
int find(lNode * first,ElemType x);



/*
	功能:清空一个链表(把链表中的所有节点全部释放)
	参数:
		@first:该链表的第一个节点的地址
	返回值:无
*/
void clearLkList(lNode * first);



/*
	功能:删除链表中第一个值为x的元素
	参数:
		@first:该链表的第一个节点的地址
		@x:要查找的数据
	返回值:
		返回新链表的第一个节点的地址
	
*/
lNode * delete(lNode * first,ElemType x);


lNode * deleteAll(lNode * first,ElemType x);


lNode * inversion(lNode * first);


#endif

```c

#include<stdio.h>

#include"linkedList.h"


void test01()
{
	lNode * first = NULL;


	first = headInsert(first,10);
	first = headInsert(first,20);
	first = headInsert(first,30);
	first = headInsert(first,40);
	
	printfLkList(first);
	first = inversion(first);
	printfLkList(first);

	clearLkList(first);
}


void test02()
{
	
	lNode * first = NULL;
	first = tailInsert(first,20);
	first = tailInsert(first,10);
	
	first = tailInsert(first,20);
	first = tailInsert(first,30);
	first = tailInsert(first,20);
	first = tailInsert(first,40);
	first = tailInsert(first,20);

	printf("%s:%d\n",__FUNCTION__,__LINE__);
	printfLkList(first);
	printf("%s:%d\n",__FUNCTION__,__LINE__);
	int x;
	scanf("%d",&x);
	first = deleteAll(first, x);

	printfLkList(first);
	clearLkList(first);
}

int main()
{
	
	test01();

	return 0;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值