/*--------------------------------------------------------
设有一个单链表,头结点为head,为递增有序,
写一个完整程序,将其改为递减有序。
----------------------------------------------------------*/
#include<stdio.h>
#include<stdlib.h>
//定义结点
struct nodetype
{
int data;//数据域(可以是int,char,float,数组,结构体等类型)
struct nodetype * next;
//next指针域,指向下一个结点。
};
struct nodetype * InitialLinkList()
{
//初始化链表,返回头指针
struct nodetype * head;
head=(struct nodetype *)malloc(sizeof(struct nodetype));//
head->next=NULL;
return head;
}
void CreateLinkListInRear(struct nodetype * head, int numbers[],
int LengthOfNumbers)
{
//尾接法创建单链表
//从数组numbers[]中取出元素建立单链表
//LengthOfNumbers为元素个数
int i;
struct nodetype * temp,* rear;
rear=head;
for(i=0;i<LengthOfNumbers;i++)
{
temp=(struct nodetype *)malloc(sizeof(struct nodetype));
temp->data=numbers[i];
temp->next=NULL;
rear->next=temp;
rear=temp;
}
}
struct nodetype * ReverseLinkList(struct nodetype * head)
{
//参照头插法建立单链表的思路,注意:为简单起见,没有释放结点空间
//注意:如果想到排序算法,就把简单问题复杂化了。
struct nodetype * newHead;
struct nodetype * temp;
struct nodetype *p;
newHead=InitialLinkList();
p=head->next;
while(p!=NULL)
{
temp=(struct nodetype *)malloc(sizeof(struct nodetype));
temp->data=p->data;
temp->next=newHead->next;
newHead->next=temp;
p=p->next;
}
return newHead;
}
void PrintIntegerLinkList(struct nodetype * head)
{//显示链表结点数据
struct nodetype *temp;
temp=head->next;
while(temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("
");
}
void main()
{
struct nodetype *head;
int y[8]={1,2,3,4,5,6,7,8};
head=InitialLinkList();//初始化
CreateLinkListInRear(head,y,8);//以数组y中元素创建链表
printf("显示原始链表中的元素,升序:
");
PrintIntegerLinkList(head);
ReverseLinkList(head);
printf("显示反转之后链表中的元素,降序:
");
PrintIntegerLinkList(ReverseLinkList(head));//显示删除6后链表
getchar();
}
运行结果如下:
显示原始链表中的元素,升序:
1 2 3 4 5 6 7 8
显示反转之后链表中的元素,降序:
8 7 6 5 4 3 2 1