C语言链表的基本操作


第1关:删除链表元素

任务描述
本关任务:给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用fun函数,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。 请在指定位置填写代码,使程序得出正确的结果。请不要增行或删行,或更改程序的结构。

相关知识
相关知识略

编程要求
请仔细阅读右侧代码,结合相关知识,在右边提示区域内进行代码补充,完成编写删除链表元素的小程序。

测试说明
平台会对你编写的代码进行测试:

预期输出:
输出每次删除的链表尾部数据。
输出当前链表数据。

代码如下:

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

typedef struct list 
{  
	int data; 
	struct list *next; 
} SLIST; 

void fun( SLIST *p) 
{ 
	SLIST  *t, *s;
	t=p->next; 
	s=p;
	while(t->next != NULL) 
	{  
		s=t; 		
	/***** 在以下一行填写代码 *****/
		t=t->next; 		
	} 
	/***** 在以下一行填写代码 *****/
	printf(" %d ", t->data); 	
	s->next=NULL; 		
	/***** 在以下一行填写代码 *****/
	free(t ); 	
}
 
SLIST *creatlist(int *a) 
{ 
	SLIST *h,*p,*q; 
	int i; 
	h=p=(SLIST *) malloc(sizeof(SLIST)); 
	for(i=0; i<N; i++) 
	{ 
		q=(SLIST *)malloc(sizeof(SLIST));
		q->data=a[i]; 
		p->next=q; 
		p=q;
	}
	p->next=0;
	return h;
}
void outlist(SLIST *h)
{
	SLIST *p;
	p=h->next;
	if (p==NULL)
		printf("\nThe list is NULL!\n");
	else { 
		printf("\nHead");
		do {
			printf("->%d",p->data);
			p=p->next;
		 } while(p!=NULL);
			printf("->End\n");
	} 
}

int main()
{
	SLIST *head;
	int a[N]={11,12,15,18,19,22,25,29};
	head=creatlist(a);
	
	printf("\nOutput from head:\n"); outlist(head);
	printf("\nOutput from tail: \n");
	
	while (head->next != NULL){
		
		fun(head);
		printf("\n\n");
		printf("\nOutput from head again :\n"); 
		outlist(head);
	}
	return 0;
}

在这里插入图片描述

第2关:链表求和

任务描述
本关任务:程序中函数fun的功能是计算出带有头结点的单向链表中各结点数据域中值之和作为函数值返回。请不要增行或删行,或者更改程序的结构。

相关知识
相关知识略

编程要求
请仔细阅读右侧代码,结合相关知识,在右边提示区域内进行代码补充,完成编写链表求和的小程序。

测试说明
平台会对你编写的代码进行测试:

预期输出:
输出链表数据。
输出链表数据之和。

代码如下:

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

typedef struct list
{ 
	int data;
	struct list *next;
} SLIST;

SLIST *creatlist(int *);
void outlist(SLIST *);

int fun( SLIST *h)
{ 
	SLIST *p; int s=0;
	p=h->next;
	while(p)
	{
		
	/***** 在以下一行填写代码 *****/
		s+= p->data ;
		
	/***** 在以下一行填写代码 *****/
		p=p->next ;
		
	}
	
	return s;
}

int main()
{
	SLIST *head;
	int a[N]={12,87,45,32,91,16,20,48};
	
	head=creatlist(a); 
	outlist(head);
	
	/***** 在以下一行填写代码 *****/
	printf("\nsum=%d\n", fun( head));
	
	return 0;
}

SLIST *creatlist(int a[])
{ 
	SLIST *h,*p,*q; 
	int i;
	h=p=(SLIST *)malloc(sizeof(SLIST));
	
	for(i=0; i<N; i++)
	{
		q=(SLIST *)malloc(sizeof(SLIST));
		q->data=a[i]; 
		p->next=q; 
		p=q;
	}
	p->next=0;
	
	return h;
}

void outlist(SLIST *h)
{ 
	SLIST *p;
	p=h->next;
	
	if (p==NULL)
		printf("The list is NULL!\n");
	else { 
		printf("\nHead ");
		do{ 
			printf("->%d", p->data);
			p=p->next; 
		} while(p!=NULL);
		printf("->End\n");
	}
}

在这里插入图片描述

第3关:链表求平均

任务描述
本关任务:N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。函数fun的功能是求出平均分,由函数值返回。例如学生的成绩是:85,76,69,85,91,72,64,87, 则平均分应当是78.625。

相关知识
相关知识略

编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充,完成编写链表求平均的小程序。

测试说明
平台会对你编写的代码进行测试:

预期输出:
输出链表存储的成绩数据。
输出平均分。

代码如下:

#include <stdio.h> 
#include <stdlib.h> 
#define N 8 
struct slist 
{ 	double s; 
	struct slist *next; 
}; 
typedef struct slist STREC; 
double fun( STREC *h ) 
{ 	
 STREC *p;
	double sum=0,avg;
	int n=0;
	p=h->next;
	while(p)
	{
		sum=sum+p->s;
		n++;
		p=p->next;
		avg=sum/n;
	}
		return avg;
}   
STREC * creat( 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=q; 
	} 
	p->next=0; 
	return h; 
} 
void 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"); 
} 
void main() 
{ 	double s[N]={85,76,69,85,91,72,64,87},ave; 
	STREC *h; 
	h=creat( s ); outlist(h); 
	ave=fun( h ); 
	printf("ave= %6.3f\n",ave); 
}


在这里插入图片描述


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二级上机题库,有每个题的题目和 答案的地方,直接把题目第一句话复制下来 查询一定能查到 第一套 1. 程序填空 程序通过定义学生结构体数组,存储了若干个学生的学号、姓名和三门课的成绩。函数fun功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大排序)。请在程序的下划线处填入正确的内容并把下划线删除,使程序正确的结果。 第一处 struct student t; 第二处 for(i=0;i<n-1;i++) 第三处 if(strcmp(a[i].name,a[j].name)>0) 2 程序修改 给定程序MODI1.C函数fun功能是:在p所指字符串ASCII码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向上顺序移动。 /**found**/ q=p+i; /**found**/ while(q>p) 3程序设计 学生的记录由学号和成绩组成,N名学生的数据已在主函数放入结构体数组s,请编写了函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数组,分数范围内的学生人数由函数值返回。 int fun(STREC *a,STREC *b,int l,int h) {int i,j=0; for(i=0;i<N;i++) if((a[i].s>=1&&a[i].s<=h) b[j++]=a[i]; return j; } 第二套 1. 程序填空 给定程序已建立一个带有头结点单向链表链表的各结点数据递增有序连接。函数fun功能是:删除链表数据值相同的结点,使之只保留一个。 第一处 free(q); 第二处 q=p->next; 第三处 q=q->next; 2. 程序修改 给定程序MODI1.C函数fun功能是:用选择法对数组的n各元素按从小到大的顺序进行排序。 /**found**/ p=j; /**found**/ p=i; 3. 程序设计 请编写一个fun函数,它的功能是:求1到m之间(含m)能被7或11整除的所有整数放在数组a,通过n返回这些数的个数。 void fun(int m,int *a,int *n) { int i; *n=0; for(i=7;i<=m;i++) if((i%7==0)||(i==0)) a[(*n)++]=i; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值