单链表删除所有值大于x而不大于y的结点
#include <stdio.h>
#include <stdlib.h>
typedef int dataType;
// 单链表
typedef struct linkNode
{
dataType data;
struct linkNode *next;
}node,*linkList;
// 1.初始化不带头结点的单链表
void init(linkList *list)
{
*list = NULL; // 表示链表指针指向空处
}
// 2.输出单链表元素
void display(linkList list)
{
node *p = list; // p为工作指针,初值为头指针
if(!p)
{
printf("链表为空!\n");
return;
}
else
{
while (p)
{
printf("%d ",p->data);
p = p->next;
}
}
printf("\n");
}
// 3.在单链表尾部插入元素
void rearInsert(linkList *list, dataType x)
{
node *p = *list,*q; // p初值为当前链表指针指向的结点
q = (node*)malloc(sizeof(node)); // 创建新节点
q->data = x;
q->next = NULL; // 新节点的指针域置空
if(!p)
*list = q; // 如果当前链表为空
else
{
while (p->next) // 找到最后一个结点
p = p->next;
p->next = q;
}
}
// 3.8.8 删除所有值大于x而不大于y的结点
void del(linkList *list, dataType x, dataType y)
{
node *p = *list,*q,*pre; // p为工作指针,pre为前驱结点指针
if(!p)
{
printf("链表为空!\n");
return;
}
while (p)
{
if(p->data > y) // 有序链表,当值超过边界则退出循环
break;
if(p->data > x && p->data <= y)
{
if(p == *list) // 如果要删除的是第一个结点
*list = p->next;
else
pre->next = p->next;
q = p;
p = p->next;
free(q); // 释放空间
} else
{
pre = p; // 使前驱结点指针指向当前结点
p = p->next; // 向后遍历
}
}
}
int main()
{
linkList list; // 声明一个指向链表的指针,即头指针
init(&list); // 初始化链表
for (int i = 1; i <= 10; i++) // 循环插入结点
rearInsert(&list,i);
display(list); // 输出链表
dataType x = 2,y = 6;
printf("删除所有值大于%d而不大于%d的结点\n",x,y);
del(&list,x,y);
display(list); // 输出链表
return 0;
}
评论 (0)