2660 链表删除-填空

2660 链表删除-填空

时间限制 : 2000/1000 MS(Java/Others) | 内存限制 :65536/32768 KB(Java/Others)

提交数 : 3560 | 通过数 : 1027

题目描述

编写一个程序实现对学生数据的操作,每个学生结点包括学号和一门课程的成绩,要求:(1)输入若干学生的学号和成绩建立链表;(2)根据学号删除指定的学生结点;(3)对链表进行输出。请对链表结点删除部分进行函数的编写。

输入要求

每行输入两个数据,第一个表示学号,第二个表示一门课程成绩。当学号输入-1时结束输入。(保证至少输入一个有效的学生信息)

然后再输入一个待删除的学号。

输出要求

按规定格式输出待删除的学号以及执行删除操作以后的链表信息,其中链表输出格式为head->x1,y1->x2,y2...->end,具体见样例

若删除后链表为空,则输出“LinkList is NULL!”。

输入样例

8901 90
8902 78
8903 93
8904 91
-1
8903

输出样例

delete:8903
head->8901,90->8902,78->8904,91->end

模板

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int number;
	float score;
	struct node *next;
};
typedef struct node SNODE;

SNODE *del_node(SNODE *head,int x)  /*用于删除结点的函数,x为待删除数据*/
{
    @-@   //设计删除节点的具体语句
}

void print(SNODE *head)  /*用于输出链表的函数*/
{
    SNODE *p;
	p=head->next;  
	if(p=='\0') printf("LinkList is NULL!\n");  
	else{
		printf("head");
		do{
			printf("->%ld,%.0f",p->number,p->score);  
			p=p->next;  
		}while(p!=NULL);
			printf("->end\n");
	}
}
SNODE *creat()   /*用于创建链表的函数*/
{
	int num;
	float sco;
	SNODE *h,*s,*r;
	h=(SNODE*)malloc(sizeof(SNODE)); 
	r=h;

	scanf("%d",&num);  
	while(num!=-1)  
	{ 
        scanf("%f",&sco);
		s=(SNODE*)malloc(sizeof(SNODE));  
		s->number=num;  
      s->score=sco;  
		r->next=s;
		r=s;
		scanf("%d",&num);
	}
	r->next='\0';
	return h;
}
int main()
{
	SNODE *head,*head2;  
	int del_num;       
	head=creat();       /*调用建立链表的函数*/;
	scanf("%d",&del_num);  //输入要删除的学号
	head2=del_node(head,del_num);       /*调用删除结点的函数*/
	print(head2);     //输出删除一个结点后的链表内容
	return 0;
}

提示

不管待删除学号是否存在,输出中 "delete:****"这一行信息必须有 。本题一般建议用GCC或G++提交。
SNODE*p2=head->next;
	SNODE*p1=head;
	printf("delete:%d\n",x);
	while(p2!=NULL)
	{
		if(p2->number==x)
		{
			p1->next=p2->next;
			free(p2);
			p2=p1->next;
		}
		else
		{
			p2=p2->next;
			p1=p1->next;
		}
	}
	return head;

上一篇:如何在不使用while循环的情况下运行服务器?


下一篇:中缀到后缀的链式实现 c++