问题描述:对给定线性链表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;
}