5.函数和递归调用(看教材)
6.结构和链表(难点)
链表的处理(这里只讲单向不循环链表)
这种链表分为:
1.不带头结点的链表
1. 带头结点的链表
为什么要有这样的区别呢?你先想一想。
2. 在不带头结点的链表中插入
分为两中情况(有些地方分3种情况)
2.1. 在链表首
起始数据定义 | typedef struct slist { int Data; slist *Next; }; |
|
|
| slist *new; New->Date=值; New->Next=NULL; |
| New->Next=head; |
| head=New; |
*注意: New->Next=head; head=New;不能交换,为什么呢?你想一想?
2.2. 在链表中和表尾
| 找到要插入的位子 |
| slist *new; New->Date=值; New->Next=NULL; |
| New->Next= p->Next; /*表尾时p->Next 是NULL*/ |
| p->Next=New; |
3. 在带头结点的链表中插入
| 找到要插入的位子 |
| slist *new; New->Date=值; New->Next=NULL; |
| New->Next= p->Next; /*表尾时p->Next 是NULL*/ |
| p->Next=New; |
对比带头结点的链表中插入和不带头结点的链表中插入,比较后你会发现在带头结点的插入较简单。
4. 删除
例1. N名学生的成绩放在带头结点的链表里。请编制一函数fun(),其功能是:其功能就是计算成绩的平均数,并将其返回。
例如: 成绩:85,76,69,85,91,72,64,87
平均成绩: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;
}