5.逆向建表
#include <stdio.h>
#include <stdlib.h>
#include "mydef.h"
ElemSN * Prelink(ElemSN *h);
int main()
{
int a[N] = {10,20,30,40,50};
ElemSN *head;
//件链表
printf("原链表是:");
head = Createlink1(a);
Printlink(head);
printf("\n");
//逆向间链表
/* head = PreCreatelink(a);
Printlink(head); */
//逆置
printf("逆置后的链表是:");
head = Prelink(head);
Printlink(head);
printf("\n");
return 0;
}
ElemSN * Prelink(ElemSN *h)
{
ElemSN *h1,*p;
h1 = NULL;
p = h;
while(h)
{
h = h->next;
p->next = h1;
h1 = p;
p = h;
}
return h1;
}
#include <stdio.h>
#include <stdlib.h>
#include "mydef.h"
ElemSN * PreCreatelink(int a[]);
ElemSN * Prelink(ElemSN *h);
ElemSN * PreOdd(ElemSN *h);
int main()
{
int a[N] = {3,2,5,8,4,7};
ElemSN *head;
//建链表
printf("原链表是:");
head = Createlink1(a);
Printlink(head);
printf("\n");
//逆向建链表
printf("逆向建链表结果: ");
head = PreCreatelink(a);
Printlink(head);
printf("\n");
//逆置
printf("逆置后的链表是:");
head = Prelink(head);
Printlink(head);
printf("\n");
//输出奇数在前偶数在后
printf("处理后结果为:");
head = PreOdd(head);
Printlink(head);
printf("\n");
return 0;
}
//就地逆置
ElemSN * Prelink(ElemSN *h)
{
ElemSN *h1,*p;
h1 = NULL;
while(h)
{
p = h;
h = h->next;
p->next = h1;
h1 = p;
}
return h1;
}
//逆向建表
ElemSN * PreCreatelink(int a[])
{
ElemSN *p,*h;
h = NULL;
for(int i = N-1;i>=0;i--)
{
p = (ElemSN *)malloc(sizeof(ElemSN));
p->data = a[i];
p->next = h;
h = p;
}
return h;
}
//奇数在前输出
ElemSN * PreOdd(ElemSN *h)
{
ElemSN *p,*q,*h1;
h1 = q = h;
p = h->next;
while(p)
{
if(p->data %2 != 0)
{
q->next = p->next;
p->next = h1;
h1 = p;
p = q->next;
}
else
{
q = p;
p = p->next;
}
}
return h1;
}
或者第二种方法
#include <stdio.h>
#include <stdlib.h>
#include "mydef.h"
ElemSN * PreOdd(ElemSN *h);
int main()
{
int a[N] = {3,2,5,8,4,7};
ElemSN *head;
//建链表
printf("原链表是:");
head = Createlink1(a);
Printlink(head);
printf("\n");
//输出奇数在前偶数在后
printf("处理后结果为:");
head = PreOdd(head);
Printlink(head);
printf("\n");
return 0;
}
//奇数在前输出
ElemSN * PreOdd(ElemSN *h)
{
ElemSN *p,*q,*h1,*t,*pk;
p = h;
h1 = NULL;
while(p)
{
if(p->data % 2) //是奇数
{
if(p == h) //头插
{
pk = p;
h = p = h->next;
pk->next = h1;
h1 = pk;
}
else //中间、尾插
{
pk = p;
q->next = p->next;
p = q->next;
pk->next = h1;
h1 = pk;
}
}
else //是偶数
{
q = p;
p = p->next;
}
}
for(t = h1;t->next;t = t->next);//将指针t指向奇数链表的末尾结点
t->next = h;
return h1;
}
第二种简洁版
#include <stdio.h>
#include <stdlib.h>
#include "mydef.h"
ElemSN * PreOdd(ElemSN *h);
int main()
{
int a[N] = {3,2,5,8,4,7};
ElemSN *head;
//建链表
printf("原链表是:");
head = Createlink1(a);
Printlink(head);
printf("\n");
//输出奇数在前偶数在后
printf("处理后结果为:");
head = PreOdd(head);
Printlink(head);
printf("\n");
return 0;
}
//奇数在前输出
ElemSN * PreOdd(ElemSN *h)
{
ElemSN *p,*q,*h1,*t,*pk;
p = h;
h1 = NULL;
while(p)
{
if(p->data % 2) //是奇数
{
pk = p;
if(p == h) //头插
{
h = p = h->next;
}
else //中间、尾插
{
q->next = p->next;
p = q->next;
}
pk->next = h1;
h1 = pk;
}
else //是偶数
{
q = p;
p = p->next;
}
}
for(t = h1;t->next;t = t->next);//将指针t指向奇数链表的末尾结点
t->next = h;
return h1;
}