c实现对给定线性链表head按节点值非递减次序输出所有节点,并把刚输出的节点从链表中删除

该博客介绍了如何处理线性链表,按节点值非递减顺序输出所有节点,并在输出后从链表中删除这些节点。内容涵盖了带头结点和不带头结点两种情况的讨论,旨在解决链表操作的问题。
摘要由CSDN通过智能技术生成

问题描述:对给定线性链表head按节点值非递减次序输出所有节点,并把刚输出的节点从链表中删除

思路:给定的链表不知道带头结点还是不带头结点。分情况讨论。

1 带头结点的单链表

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 6
#define DataType int

typedef struct node
{
    DataType data;
    struct node *next;
} LinkNode,*LinkList;

void sort_output_delete(LinkList head) //按节点值非递减次序输出所有节点,并把刚输出的节点从链表中删除 
{
    LinkList  p,q,r,s;//首先得有四个指针。设为p,q,r,s.q为当前最小元素指针,s为工作指针。p为q的前驱,r为s的前驱。
    
    while(head->next)
    {
    	p = head; q = head->next;
        r = q; s = r->next;
        while(s)
        {
            if(q->data > s->data)//q指向当前最小元素指针,q的前驱p也得跟着修改
        	{
                q = s;
                p = r; 
            } 
            //s为工作指针,向前移动,s的前驱r也得跟着修改
            r = s;
            s = s->next;    		
        }
        printf("%3d",q->data);
        
        p->next = q->next;
        free(q);
    }
       
}
LinkList createlist(int Da[],int M)//头插法产生带头结点的单链表 
{
    LinkList head,p;
    int i = 0;
    head = (LinkList)malloc(sizeof(LinkNode));
    head->next = NULL;
    for(; i < M; i++)
    {
        p = (LinkList)malloc(sizeof(LinkNode));
        p->data = Da[i];
        p->next = head->next;
        head->next = p;        
    }
    return head;
}
int main()
{
    int Da[MAXSIZE] = {5,2,1,5,6,0};
    LinkList head ;
    head = createlist(Da,MAXSIZE);
    sort_output_delete(head);
    return 0;
}

2.不带头结点的单链表

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 6
#define DataType int

typedef struct node
{
    DataType data;
    struct node *next;
} LinkNode,*LinkList;

void sort_output_delete(LinkList head) //按节点值非递减次序输出所有节点,并把刚输出的节点从链表中删除 
{
    LinkList  p,q,r,s;//首先得有四个指针。设为p,q,r,s.q为当前最小元素指针,s为工作指针。p为q的前驱,r为s的前驱。
    while(head)
    {
    	p = NULL;
		q = head;
        r = q; s = r->next;
        while(s)
        {
            if(q->data > s->data)//q指向当前最小元素指针,q的前驱p也得跟着修改
        	{
                q = s;
                p = r; 
            } 
            //s为工作指针,向前移动,s的前驱r也得跟着修改
            r = s;
            s = s->next;    		
        }
        printf("%3d",q->data);
        //删除q时,要考虑下q的前驱。
       //如果q的前驱为空,即当前最小元素为首节点,那么:head = head->next或者写成 q = q->next; head =q;
        if(p==NULL) head = head->next; 
        else p->next = q->next;//如果q的前驱不为空,即前驱为一个元素,那么:p->next = q->next;
        free(q);
    }
       
}
LinkList createlist(int Da[],int M)//头插法产生不带头结点的单链表 
{
    LinkList head,p;
    int i = 0;
    head = NULL;
    for(; i < M; i++)
    {
        p = (LinkList)malloc(sizeof(LinkNode));
        p->data = Da[i];
        p->next = head;
        head = p;        
    }
    return head;
}
int main()
{
    int Da[MAXSIZE] = {5,2,1,5,6,0};
    LinkList head ;
    head = createlist(Da,MAXSIZE);
    sort_output_delete(head);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值