中国大学 MOOC C语言程序设计----编程部分答案解析

C语言程序设计----编程部分答案解析

编程题目10

1正向建立单链表。(25分)

题目内容:输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序建立单链表并输出。

输入格式:一行内输入若干个正整数,之间用空格隔开,并以-1结束。

输出格式:一行内输出建立的单链表数据结果,之间用两个分隔符 – 隔开,结束标志-1不输出。

输入样例:2 4 6 8 10 -1

输出样例:–2--4–6--8–10
时间限制:500ms 内存限制:32000kb

代码:

#include
#include
#include

typedef struct node{
 int data;
 struct node *next;
}node,* LinkList;
LinkList list;

void init()
{
 LinkList p,q;
 q=(LinkList)malloc(sizeof(node));
 list=q;
 scanf("%d",&(q->data));
 q->next=NULL;
 while(q->data>=0)
 {
  p=(LinkList)malloc(sizeof(node));
  scanf("%d",&(p->data));
  p->next=NULL;
  q->next=p;
  q=p;
 }
 p=list;
 while(p->data>=0)
 {
  printf("--%d",p->data);
  p=p->next;
 }
 printf("\n");
}

int main()
{
 init();    
 LinkList p=list;

}

2逆置单链表。(30分)

题目内容:一个单链表L=(a1 , a2 , … , an-1 , an),其逆单链表定义为L’=( an , an-1 , … , a2 , a1),编写算法将单链表L逆置,要求逆单链表仍占用原单链表的空间。

输入格式:一行内输入原单链表中的数据(若干个正整数,之间用空格隔开,并以-1结束)

输出格式:一行内输出建立的原单链表数据结果,之间用两个分隔符 – 隔开,结束标志-1不输出。

( 下一行内输出逆置后的单链表数据结果,之间用两个分隔符 – 隔开。)

输入样例:2 4 6 8 10 -1

输出样例:

		--2--4--6--8--10

        --10--8--6--4--2

时间限制:500ms 内存限制:32000kb

代码:

#include 
#include 
#include
typedef struct List
{
	int data;
	struct List *next;
}list,*Linklist;

void newList(Linklist l)
{
	l->next = NULL;
}

void setList(list * l)
{
	int i = 1;
	int j;
	while (i)
	{
		scanf("%d", &j);
		if (j == -1)
		{
			i = 0;
		}
		else
		{
			Linklist l1 = (list *)malloc(sizeof(list));
			l1->data = j;
			l->next = l1;
			l1->next = NULL;
			l = l->next;
		}
	}
}

void printfList(Linklist l)
{

	while (l->next)
	{
		printf("--%d", l->next->data);
		l = l->next;
	}
	printf("\n");
}

Linklist add(Linklist LA, Linklist LB)
{
	
	Linklist la=LA;
	Linklist l = LA;
	Linklist lb = LB;
	
	LA = LA->next;
	LB = LB->next;
	la->next = NULL;
	while (LA!=NULL&&LB!=NULL)
	{
		if (LA->data < LB->data)
		{
			la->next = LA;
			la = LA;
			LA = LA->next;
		}
		else
		{
			la->next = LB;
			la = LB;
			LB = LB->next;
		}
	}
	
	if (LA)
	{
		la->next = LA;
	}
	if(LB)
	{
		la->next = LB;
	}
	
	free(lb);
	return l;
}

int main()
{
	Linklist LA = (list *)malloc(sizeof(list));
	Linklist LB = (list *)malloc(sizeof(list));
	newList(LA);
	newList(LB);
	setList(LA);
	setList(LB);
	Linklist LC = add(LA, LB);
	printfList(LC);
	system("pause");
	return 0;
}

附:(课本部分)

struct stud
{
long num;                   //学号
char name[11];              //姓名
float score;                //成绩
struct stud *next;
};
void merge(struct stu *La,struct stu *Lb)
{
	struct stud *a,*b,*c;
	c=La;
	a=La->next;
	b=Lb->next;    //合并前 
	while (a!=NULL&&b!=NULL)   //a和b都还存在 
	{
		if(a->num<=b->num)
		{
			c->next=a;
			c=a;
			a=a->next;
		}
		else{
			c->next=b;
			c=b;
			b=b->next;
		} 
	}
	if(a!=NULL)
	c->next=a;  //若a没有处理完 
	else
	c->next=b;  //若b没有处理完 
	
	free(Lb);  //释放Lb的头结点 
	 
	
}

你可能感兴趣的:(c语言答案)