单链表专题

1. 创建单链表(以下所写的均为带头结点的链表)

分以下几种情况

  • 输入数据(输入-1结束输入)
struct Link
{
	int data;
	struct Link* next;
};

//创建链表
struct Node* creatLink()
{
	struct Node* p1, * p2, * head = NULL;
	p1 = p2 =(struct Node*)malloc(LEN);

	printf("(输入-1结束输入)请输入节点的数据值-->\n");
	scanf("%d", &p1->data);
	p1->next = NULL;

	while (-1 != p1->data)
	{
		if (head == NULL)
		{
			head = p1;
			p2 = p1;
		}
		else
		{
			p2->next = p1;
			p2 = p1;
		}

		p1 = (struct Node*)malloc(LEN);
		scanf("%d", &p1->data);
		p1->next = NULL;
	}
	p2->next = NULL;
	return head;
}
  • 创建带n个结点的链表
struct Link
{
	int data;
	struct Link* next;
};


//创建链表
struct Link* cratDataLink(int n)
{
	struct Link* head, * p1, * p2;
	int i;

	if (0 == n)
	{
		return NULL;
	}
	head = p1 = p2 = (struct Link*)malloc(LEN);

	printf("\n请输入%d个整型数据:\n", n);
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &p1->data);
		if (NULL == head)
		{
			head = p1;
		}
		else
		{
			p2->next = p1;
		}
		p2 = p1;
		p1 = (struct Link*)malloc(LEN);
	}
	p2->next = NULL;

	return head;
}
  • 结束

2. 单链表的遍历输出

struct Link
{
	int data;
	struct Link* next;
};
//打印链表数据
void printDataLink(struct Link* head)
{
	while (head !=NULL)
	{
		printf("%d-->", head->data);
		head = head->next;
	}
	printf("NULL\n");
}

3. 单链表的数据排序(仅交换数据域)

struct Link
{
	int data;
	struct Link* next;
};

//对整型进行交换
void swapI(int* a, int* b)
{
	int temp = 0;

	temp = *a;
	*a = *b;
	*b = temp;
}

//对链表的数据项进行排序(升序)		这里只交换数据域,不交换数据节点
struct Node* sortLinkData(struct Node* head)
{

	if (head == NULL)
	{
		return NULL;
	}

	struct Node* p;
	p = head->next;

	/*定义一个尾指针,初值为空,以后为每次的最大值*/
	struct Node* end = NULL;

	while (end != head)
	{
		/*pre和pnext一前一后*/
		struct Node* pre = head;
		struct Node* pnext = p;

		while (pnext != end)
		{
			/*比较相邻节点的数据*/
			if (pre->data < pnext->data)
			{
				swapI(&pre->data, &pnext->data);	/*交换整型数据*/
			}

			/*pre与pnext同时向后移动一个节点*/
			pre = pre->next;
			pnext = pnext->next;
		}
		/*该次循环结束,找到的是该次循环中的最大值*/
		end = pre;
	}
	return head;
}

4. 单链表数据逆置

struct Link
{
	int data;
	struct Link* next;
};

//链表数据逆置
struct Link* reverseLink(struct Link* head)
{
	struct Link* h, * p1, * p2;
	int flag = 0;

	h = p1 = p2 = head;

	while (h != NULL)
	{
		if (flag == 0)
		{
			h = h->next;
			p1->next = NULL;
			flag++;
		}
		else if (flag == 1)
		{
			p2 = p1;
			p1 = h;
			h = h->next;
			p1->next = p2;

		}
	}

	return p1;
}

5. 删除单链表中值为奇数的节点

//删除data为奇数的结点
struct Link* delOddsNode(struct Link* head)
{
	struct Link* p1, * p2;

	if (head == NULL)
	{
		return head;
	}

	p1 = head->next;
	p2 = head;

	while (p1 != NULL)
	{
		if (p1->data % 2 != 0)
		{
			p2->next = p1->next;
			free(p1);
			p1 = p2->next;
		}
		/*如果节点是偶数,也需要进行指针的移动保存数据,
		注意在写的时候要考虑完全*/
		else   
		{
			p2 = p1;
			p1 = p1->next;
		}
	}

	//若是头结点为奇数
	if (head->data % 2 != 0)
	{
		p2 = head;
		head = head->next;	//重新选取新的头结点
		free(p2);
	}
	return head;
}

在这里插入图片描述

  1. 求两个链表的交集
struct Student
{
	int number;
	float score;
	struct Student* next;
};

struct List
{
	//建立带头、尾指针的链表
	struct Student* head;		
	struct Student* tail;
};

//求两个链表的交集
struct List* commonPartList(struct List* listOne, struct List* listTwo)
{
	struct List* comList = creatList();
	struct Student* p1 = listOne->head->next;

	while (p1 != NULL)
	{
		struct Student* p2 = listTwo->head->next;

		while (p2 != NULL)
		{
			//比较学号与分数是否相等
			if (p1->number == p2->number && p1->score == p2->score)
			{
				insertData(comList, p1->number, p1->score);
				break;
			}
			p2 = p2->next;			//指针后移
		}
		p1 = p1->next;				//指针后移
	}
	return comList;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是快卡黎嫩哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值