码迷,mamicode.com
首页 > 其他好文 > 详细

链表(三)——链表删除冗余结点&插入结点到有序链表

时间:2014-07-19 23:26:29      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:单向链表   插入结点   删除冗余结点   

1.一个以递增方式排列的链表,去掉链表中的冗余值。
思路一:设有两个指针p和q,使p不动,q依次往后循环直到p->data不等于q->data,再将中间的冗余数据删除。
思路二:设有两个指针p和q,使p在前,q在后,只要找到一个冗余就删除一个,依次往后删除。
输入的链表:1 3 3 3 3 6 6 8 9 10
删除后的链表:1 3 6 8 9 10
比较两种思路,思路二的想法相比于思路一要好,所以这里实现思路二的代码。
2.将一个结点插入到一个有序的链表中。
思路:首先要判定这个链表是递增排列的链表还是递减排列的链表,然后相对应的查找这个结点需要插入的位置。对于递增链表来说,需要查找到第一个节点值大于等于要插入的结点,然后将需要插入的结点插入到该结点前面;对于递减链表来说,需要查找到第一个小于等于要插入的结点,然后将需要插入的结点插入到该结点前面。需要考虑的特殊情况是插入的结点可能会插入在第一个位置。
#include <stdio.h>
#include <malloc.h>

#define NULL	0

typedef struct node {
	int data;
	struct node *next;
}ElemSN;


ElemSN * creat_link(int ms); //逆向创建一个链表
void print_link(ElemSN *head); //输出单向链表
void delete_rdy(ElemSN *head); //删除冗余的项
ElemSN * insert_node(ElemSN *head, int x); //插入结点到有序链表
ElemSN * clear_link(ElemSN *head); //删除链表

int main()
{
	ElemSN *head;
	int ms, x;

	printf("Please input node number:");
	scanf("%d", &ms);
	head = creat_link(ms); //创建链表
	print_link(head);
	delete_rdy(head);
	print_link(head);
	head = insert_node(head, 5);
	print_link(head);
	head = clear_link(head); //删除链表
}

ElemSN * creat_link(int ms)
{
	ElemSN *h = NULL, *p;
	int i, x;

	for(i = 0; i < ms; i++)
	{
		printf("Please input data:");
		scanf("%d", &x);
		p = (ElemSN *)malloc(sizeof(ElemSN));
		p->data = x;
		p->next = h;
		h = p;
	}

	return h;
}

void print_link(ElemSN *head)
{
	for(; head; head = head->next)
	{
		printf("%d ", head->data);
	}
	printf("\n");
}

void delete_rdy(ElemSN *head)
{
	ElemSN *p, *q;

	if(NULL == head)
		return;
	p = head;
	q = p->next;
	while(q)
	{
		if(p->data == q->data)
		{
			p->next = q->next;
			free(q);
			q = p->next;
		}
		else
		{
			p = q;
			q = p->next;
		}
	}
}

ElemSN * insert_node(ElemSN *head, int x)
{
	ElemSN *p, *q;

	if(NULL == head || NULL == head->next)
		return NULL;
	p = head;
	q = head; //这里不能赋值为head->next,比较必须从第一个结点开始
	if(q->data >= q->next->data) //递减链表
	{
		for(; q && q->data >= x; p = q, q = q->next){}
	}
	else //递增链表
	{
		for(; q && q->data <= x; p = q, q = q->next){}
	}

	if(NULL == q) //插入在链表尾部
	{
		q = (ElemSN *)malloc(sizeof(ElemSN));
		q->data = x;
		q->next = NULL;
		p->next = q;
	}
	else if(q == head) //插入在表首
	{
		q = (ElemSN *)malloc(sizeof(ElemSN));
		q->data = x;
		q->next = head;
		head = q;
	}
	else //插入在中间位置
	{
		p->next = (ElemSN *)malloc(sizeof(ElemSN));
		p->next->next = q;
		p->next->data = x;
	}

	return head;
}

ElemSN * clear_link(ElemSN *head)
{
	ElemSN *p;

	while(head)
	{
		p = head->next;
		free(head);
		head = p;
	}

	return head;
}

链表(三)——链表删除冗余结点&插入结点到有序链表

标签:单向链表   插入结点   删除冗余结点   

原文地址:http://blog.csdn.net/laoniu_c/article/details/37963819

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!