二级C语言(6)

来源:互联网 发布:php程序员主要职责 编辑:程序博客网 时间:2024/05/01 08:22

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;

}