王道p40 7.设在一个带表头结点的单链表中所有元素结点的数据值无序,试编写一个函数,删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素 (若存在 )。

 本题代码为(有注释)

void delete(linklist* L, int min, int max)//删除给定的两个值之间的元素
{
	lnode* p = (*L)->next, * q = *L;
	while (p != NULL)
	{
		if (p->data > min && p->data < max)//判断在是否在两个值的中间
		{
			q->next= p->next;//使q的后继指向p的后继
			free(p);//释放p的内存
			p = q->next;//使p指向q的后继
		}
		else
		{
			q = q->next;//q跟p都想后遍历
			p = p->next;
		}
	}
}

完整测试代码

#include
#include
typedef struct lnode
{
	int data;
	struct lnode* next;
}lnode,*linklist;
int n = 6;
int a[6] = { 3,2,4,9,8,7 };
void buildlinklist(linklist* L)
{
	*L = (lnode*)malloc(sizeof(lnode));
	(*L)->next = NULL;
	int i = 0;
	lnode* s = *L, * r = *L;
	for (i = 0; i < n; i++)
	{
		s = (lnode*)malloc(sizeof(lnode));
		s->data = a[i];
		s->next = r->next;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
void delete(linklist* L, int min, int max)//
{
	lnode* p = (*L)->next, * q = *L;
	while (p != NULL)
	{
		if (p->data > min && p->data < max)
		{
			q->next= p->next;
			free(p);
			p = q->next;
		}
		else
		{
			q = q->next;
			p = p->next;
		}
	}
}
void print(linklist* L)
{
	lnode* k = (*L)->next;
	while (k != NULL)
	{
		printf("%d ", k->data);
		k = k->next;
	}
}
int main()
{
	linklist L;
	buildlinklist(&L);
	printf("原始单链表为:");
	print(&L);
	delete(&L,2,6);
	printf("\n删除后的单链表为:");
	print(&L);
	return 0;
}

你可能感兴趣的:(王道课后习题单链表,数据结构,算法,c语言)