现在的位置: 首页 > 综合 > 正文

第2章 线性表——链式线性表的表示和实现

2013年10月05日 ⁄ 综合 ⁄ 共 1742字 ⁄ 字号 评论关闭
/*
 *     这个程序是用链式线性表实现表中元素的删除、增添、查找、输出、求和。 
 *     其中增添函数中用到查找函数。  
 */
#include<stdio.h>
#include<stdlib.h> 
#define LEN sizeof(student)   
typedef struct student{ /*学生信息*/
	long num;
	double score;  
	struct student *next;       
}student;
student *create(){ /*插入学生信息,构建链表*/
	student *head,*p1,*p2;
	int n;
	p1 = p2 = (student*)malloc(LEN);
	head = NULL;  
	n = 1;
	while(n<=10){
		scanf("%d%lf",&p1->num,&p1->score);    
		if(n==1)
			head = p1;
		else        
			p2->next = p1;
		p2 = p1;
		p1 = (student*)malloc(LEN);
		n++;
	}
	p2->next = NULL;
	return head;
}
student *delete1(student *head,long num){ /*删除链表中的元素*/
	student *p,*pre;
	p = head;
	if(head->num==num){
		pre = head;
		head = pre->next;
	}else
		pre = head;
		p = head->next;
		while(p!=NULL){
			if(p->num==num)
				break;
			else{
				pre = p;
				p = p->next;
			}
		}
	pre->next = pre->next->next;
	return head;
}
student *search(student *head,long num){ /*查找链表中元素*/
	int i;                               /*并返回元素的位置*/
	student *p;
	p = head;         
	for(i=1;;i++){ 
		if(p==NULL||p->num==num){
			break;
		}
		p = p->next;
	}
	return p;
}
student* add(student* head,long num){ /*将新元素添加到链表的指定位置*/
	student *p,*s;
	long num2;
	double score2;
	s=(student *)malloc(LEN);
	p=search(head,num);    
	if(p!=NULL){
		scanf("%ld%lf",&num2,&score2);
	    s->num = num2;
	    s->score = score2;       
	    s->next = p->next;
	    p->next = s;
	} 
	return head;
}
double sum(student *head){ /*将链表中元素的指定成员的值加和*/
	int i;
	double sum1;     
	student *p;
	p = head;
	sum1 = 0;
	for(i = 1;;i++){     
		if(p==NULL)       
			break;
		sum1 = sum1+p->score;
		p = p->next;
	}
	return sum1;
}
void print(student *head){ /*打印链表*/
	int i;
	student *p;
	p = head;   
	printf("\n");
	for(i = 1;;i++){
		if(p==NULL)
			break;
		printf("%4ld  %.1lf\n",p->num,p->score);
		p = p->next;
	}
}
int main(){
	long num1,num2;
	double sum1;
	student *t,*g,*k; 
	t = create();           
	scanf("%ld",&num1);
	g = delete1(t,num1);   
	scanf("%ld",&num2);
	k = add(g,num2);
	print(k);
	sum1 = sum(k);
	printf("\n%7.1lf\n",sum1);
	return 0;
}
/*
 *    测试案例:
 *
 *    输入:
 *         1 10
 *         2 20
 *         3 30
 *         4 40
 *         5 50
 *         6 60
 *         7 70
 *         8 80
 *         9 90
 *        10 100
 *
 *        0004 //要删除的元素的 num 
 *        0005 //新元素插入在 num 为这一数值的元素后
 *        0011 110 //新元素的信息
 *
 *   输出:
 *          1  10.0
 *          2  20.0
 *          3  30.0
 *          5  50.0
 *         11  110.0
 *          6  60.0
 *          7  70.0
 *          8  80.0
 *          9  90.0
 *         10  100.0
 *
 *         620.0
 */

抱歉!评论已关闭.