数据结构基础算法-链表

#include<stdio.h>
#include<stdlib.h>
# define N 10


typedef struct node{
int data;
struct node * next;
} ElemSN;


ElemSN * GreatLink1(int a[],int n){
ElemSN *h,*t,*p;
int i;
//正向创建头结点
h=t=(ElemSN *)(malloc(sizeof (ElemSN)));
h->data=a[0];
h->next=NULL;


for(i=1;i<n;i++)
{
p=(ElemSN *)(malloc(sizeof (ElemSN)));
p->data=a[i];
p->next=NULL;
t->next=p;
t=p;
}
return h;
}


ElemSN * GreatLink2(int a[]){
ElemSN *h,*p;
int i;
//反向创建头结点
h=NULL;
for(i=N-1;i>-1;i--)
{
p=(ElemSN *)(malloc(sizeof (ElemSN)));
p->data=a[i];
p->next=h;
h=p;
}
return h;
}


//输出链表
void PrintLink(ElemSN *h){
ElemSN *p;
for(p=h;p!=NULL;p=p->next)
printf("%5d",p->data);
}


//输出链表中奇数位点
void Outobb(ElemSN *h){
ElemSN *p;
int i=1;
for(p=h;p;p=p->next,i++)
{
if(i%2)
printf("%5d",p->data);
}
printf("\n");
}


//逆向输出链表
void Exchange(ElemSN *h){
ElemSN *p,*end;
end=NULL;
while(end-h)
{
for(p=h;(p->next)-end;p=p->next);
printf("%5d",p->data);
end=p;
}
printf("\n");
}


//返回单向链表个数
int Number(ElemSN * h){
ElemSN *p;
int i=0;


for(p=h;p;p=p->next,i++);


return i;
}


//返回单向链表奇数个数
int ObbNumber(ElemSN *h){
ElemSN *p;
int i=0;
for(p=h;p;p=p->next)
i=i+p->data%2;


return i;
}


//返回最大值及个数
void MaxNumber(ElemSN *h){
ElemSN *p;
int i,max;
i=0;
max=h->data;
for(p=h;p;p=p->next)
{
if((p->data)>max)
max=p->data;
}
for(p=h;p;p=p->next)
{
if(p->data==max)
i++;
}
printf("输出最大值:%d\n",max);
printf("输出最大值个数:%d\n",i);
}


//交换头结点和尾节点数据域值
void ChangeFL(ElemSN *h)
{
ElemSN *p;
int t;
for(p=h;p->next;p=p->next);
t=p->data;
p->data=h->data;
h->data=t;
}


//交换头尾节点
void ChangeFLD(ElemSN *h)
{
ElemSN *p,*q,*t;
t=h->next;
for(p=h,q=h->next;q;q=q->next,q=q->next,p=p->next);
q->next=t;
p->next=h;
h->next=NULL;
h=t;
}


int main(void)
{
int a[N]={7,2,9,4,7,8,9,14,11,14};
ElemSN * head;
int n,obbn;
head=NULL;;
head=GreatLink2(a,10);


printf("输出链表:");
PrintLink(head);
printf("\n");


    n=Number(head);
printf("返回单向链表个数:%d\n",n);


obbn=ObbNumber(head);
printf("返回单向链表奇数个数:%d\n",obbn);


printf("输出链表中奇数位:");
Outobb(head);


printf("逆向输出链表:");
Exchange(head);
    
//返回最大值及个数
MaxNumber(head);
    
printf("交换头结点和尾节点数据域值:");
    ChangeFL(head);
PrintLink(head);
printf("\n");


printf("交换头结点和尾节点:");
    ChangeFLD(head);
PrintLink(head);
printf("\n");


return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值