#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Node,*Linklist;
void Createlist(Linklist p)
{
Node *newnode,*last;
int flag;
int dat;
flag=1;
last=p;
while(flag)
{
scanf("%d",&dat);
if(dat!=0)
{
newnode=(Node*)malloc(sizeof(Node));
newnode->data=dat;
last->next=newnode;
last=newnode;
}
else
{
flag=0;
last->next=p;
}
}
}
//////////////////////////////////////////////////
int Length(Linklist p)
{
Node *elem;
int len=0;
elem=p->next;
while(elem!=p)
{
len++;
elem=elem->next;
}
return len;
}
/////////////////////////////////////////////////
void Display(Linklist p)
{
Node *elem;
elem=p->next;
printf("链表:");
while(elem!=p)
{
printf("%d ",elem->data);
elem=elem->next;
}
}
///////////////////////////////////
void Reverse(Linklist p)
{//就地至逆
/*
类比排队,头指针是队旗,然后依次是队员。要就地至逆而不再申请空间
队尾直接插到队旗后,次尾站到原队尾后。。。
*/
Node *elem,*head,*last;
head=p->next;//head是原来链表的第一个元素
last=p; //last是新链的最后一个元素
elem=p;
while(elem->next!=p)
{
while(elem->next!=last) //找到当前队伍的最后元素
{
elem=elem->next;
}
last->next=elem; //插入到新队后面
last=elem;
elem=head; //重新指向旧队伍第一个元素
if(elem->next==last) //剩下最后一个元素时
{
elem->next=p;
last->next=elem; //把第一个元素插入新队尾 置逆结束
}
}
}
//////////////////////////////////////////////////
void Sort(Linklist p)
{
Node *elem,*nod;
int temp,len;
elem=p->next;
nod=p; //nod用来指向顺序的末尾元素
len=Length(p);
while(len>=0)
{
while(elem!=p)
{
if(elem->data<elem->next->data)//从大到小
{
temp=elem->data;
elem->data=elem->next->data;
elem->next->data=temp;
// nod=elem->next;
}
elem=elem->next;
}//while end 出了这个循环 elem==p
elem=elem->next; //回到原链第一个元素
len--;
}//while
}
//////////////////////////////////////////////////
main()
{
Linklist pa;
// int len;
pa=(Linklist)malloc(sizeof(Linklist));
printf("输入链表元素,以0表示结束:\n");
Createlist(pa);
Display(pa);
printf("\n逆序");
Reverse(pa);
Display(pa);
Sort(pa);
Display(pa);
}
后来发现就地至逆有个更简单的方法,依次对头指针后的每个结点,用头插法建立链表就行。比我用的方法简单多了......郁闷链表的就地至逆和冒泡排序
最新推荐文章于 2022-08-13 21:23:05 发布