C语言程序设计第四版(谭浩强)9.11 有两个链表a,b 设结点中包含学号姓名。从a链表中删去与b链表中有相同学号的那些结点。

//*作者:冰糖
//*日期:2018年12月1日
//*章节:第九章
//*题号:11 
//*题目:有两个链表a,b;设结点中包含学号姓名。从a链表中删去与b链表中有相同学号的那些结点。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct linknode  
{ 	int num;
	char name[20];
	struct linknode *next;
}node;  
node *creat()
{ 	node *h = NULL,*s,*t;	
    int d;
	int i = 1;
 	char name1[20];
	while(1)
 	{ 		printf("输入第%d结点的学号,姓名\n",i);
	  		scanf("%d%s",&d,&name1);
	 		if(d == 0)		
			 	break;
	 		if(i == 1)
	 		{ 
			 	h = (node *)malloc(sizeof(node));
	 			h->num = d; 
				strcpy(h->name,name1);
				h->next = NULL; 	
				t = h; 		
			} 		
			else 
			{ 	
				s = (node *)malloc(sizeof(node));
	 			s->num = d; 		
				strcpy(s->name,name1);
				s->next = NULL; 	
				t->next = s; 	
				t = s;		
			}	
			i++;
 	} 	
	return h;
} 
void print(node *h)
{ 	node *p = h; 
	if(p == NULL) 
		printf("空表\n");
 	while(p != NULL) 	
	{ 		
		printf("%d %s\n",p->num,p->name);
 		p = p->next; 
	} 	
	printf("\n");
}  
node *link(node *ha,node *hb) 
{ 	
	node *r,*head,*s,*p,*q;
 	head =(node *)malloc(sizeof(node)); 
	head->next = NULL;
 	r = head;
 	p = ha;
 	while(p!=NULL)
 	{ 		q = hb;
	  		while((q != NULL) && (p->num != q->num))
 			q = q->next;
	 		if(q != NULL)
	 		{ 		
				r->next = p->next;
	 			free(p); 	
				p = r->next;
			} 		
			else 		
			{ 			
				r->next = p; 
				r = p; 		
				p = p->next; 
				r->next = NULL;
	 		} 	
	}  	
	s = head;
 	head = head->next;
 	free(s);
 	return head;
} 
int main() 
{ 	
	node *ha,*hb,*s;
 	printf("\n请输入链表a的信息,学号等于零时结束输入:格式(学号 姓名)\n");
	ha = creat();
	printf("\n链表a的信息为:\n");
	print(ha); 	
	printf("\n请输入链表b的信息,学号等于零时结束输入:格式(学号 姓名)\n");	
	hb = creat(); 	
	printf("\n链表b的信息为:\n");	
	print(hb); 	
	s = link(ha,hb); 	
	printf("\n删除后的链表信息为:\n");	
	print(s);	
	return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值