二级C语言(6)

5.函数和递归调用(看教材)

6.结构和链表(难点)

链表的处理(这里只讲单向不循环链表)

这种链表分为:

1.不带头结点的链表

N

D1

N

D2

N

D3

NULL

D3

head

1.       带头结点的链表

head

 

NULL

N

D1

N

D2

N

D3

NULL

D3

为什么要有这样的区别呢?你先想一想。

2.       在不带头结点的链表中插入

分为两中情况(有些地方分3种情况)

2.1.     在链表首

起始数据定义

typedef struct slist

{

       int Data;

       slist *Next;

};

N

D1

N

D

head

N

D

NULL

D

 

N

D

New

N

D

NULL

D

NULL

DNew

head

slist *new;

New->Date=;

New->Next=NULL;

N

D

New

N

D

NULL

D

N

DNew

head

New->Next=head;

N

D

New

N

D

NULL

D

N

DNew

×

head

headNew;

*注意: New->Next=head; headNew;不能交换,为什么呢?你想一想?

2.2.     在链表中和表尾

N

D

N

D

NULL

D

p

找到要插入的位子

N

D

New

N

D

NULL

D

N

DNew

p

slist *new;

New->Date=;

New->Next=NULL;

N

D

N

D

NULL

D

New

N

DNew

p

New->Next= p->Next;

/*表尾时p->Next NULL*/

N

D

N

D

NULL

D

New

N

DNew

p

×

p->NextNew;

3.       在带头结点的链表中插入

N

head

N

D

NULL

D

p

head

。。。。

找到要插入的位子

N

head

 

New

N

D

NULL

D

N

DNew

p

head

。。。。

slist *new;

New->Date=;

New->Next=NULL;

。。。。

N

head

 

N

D

NULL

D

New

N

DNew

p

head

New->Next= p->Next;

/*表尾时p->Next NULL*/

N

head

N

D

NULL

D

New

N

DNew

p

×

。。。。

p->NextNew;

 

对比带头结点的链表中插入和不带头结点的链表中插入,比较后你会发现在带头结点的插入较简单。

4.       删除

N

head

 

N

D

NULL

D

p

head

p->Next= p->Next ->Next;

例1.  N名学生的成绩放在带头结点的链表里。请编制一函数fun(),其功能是:其功能就是计算成绩的平均数,并将其返回。

例如    成绩8576698591726487

      平均成绩:78.625

注意:部分源程序已给出。

请勿改动主函数main()的内容。

试题程序:

#include <stdlib.h>

#include <stdio.h>

#define N 8

struct slist

{

double s;

struct slist *Next;

};

typedef struct slist STREC;

double fun(STREC *h)

{

}

STREC * Create(double *s)

{

STREC *h,*p,*q;

int i=0;

h=p=(STREC *)malloc(sizeof(STREC));

p->s=0;

while(i<N)

{

     q=(STREC *)malloc(sizeof(STREC));

     q->s=s[i];

     i++;

     p->Next=q;

     p=p->Next;

}

p->Next=0;

return h;

}

outlist(STREC *h)

{

STREC *p;

p=h->Next;

printf("head");

do

{

     printf("->% 4.1f ",p->s);

     p=p->Next;

}while(p!=0);

printf("/n/n");

}

main()

{

double s[N]={85,76,69,85,91,72,64,87},ave;

STREC *h;

h=Create(s);

outlist(h);

ave=fun(h);

printf("ave=% 6.3f /n",ave);

}

本题难点:如何遍历整个链表,但在试题程序有。所以并不难。

参考答案

double fun(STREC *h)

{

double aver=0.0;

while(h!=NULL)

{

     aver+=h->s;

     h=h->Next;

}

aver/=N;

return aver;

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值