user-0 提问: c语言中.链表综合应用.求教大神们

回复:
user: user-1
content: http://blog.csdn.net/kevin_iot/article/details/50482423推荐该博文，学习链表设计

user: user-2
content: #include <stdio.h> #include <stdlib.h> //#include <windows.h>   typedef struct _link_node { 	int value; 	struct _link_node* next; }link_node_t; //////////////////////////////////////////////// void print_link_table(link_node_t* phead) { 	link_node_t* ptmp = phead->next; 	 	while (ptmp) 	{ 		printf("%d ", ptmp->value); 		ptmp = ptmp->next; 	} 	printf("\n"); 	 } ///////////////////////////////////////////////// void insert_element_to_link_table(link_node_t* phead, int value) { 	link_node_t* ptmp = phead; 	link_node_t* ptmp2 = NULL; 	 	//find the tail 	while (ptmp->next != NULL) 	{ 		ptmp = ptmp->next;  	} 	 	//insert the node 	ptmp2 = (link_node_t*)malloc(sizeof(link_node_t)); 	ptmp2->value = value; 	ptmp2->next = NULL; 	 	ptmp->next = ptmp2; }  ///////////////////////////////////////////////// void free_all_node_in_link_table(link_node_t* phead) { 	link_node_t* ptmp; 	while (phead) 	{ 		ptmp = phead; 		phead = phead->next; 		free(ptmp); 	} } ///////////////////////////////////////////////// void show_menu(void) { //	system("cls"); 	printf("================================\n"); 	printf("== 1:创建一个含头节点的空链表\n"); 	printf("== 2:插入一个数组\n"); 	printf("== 3:插入一个整数\n"); 	printf("== 4:删除一个整数\n"); 	printf("== 5:逆序链表\n"); 	printf("== 6:退出程序\n"); 	printf("================================\n"); 	printf("请输入选项: ");   } ///////////////////////////////////////////////// int get_input(void) { 	int option; 	 	scanf("%d", &option);  	return option; }  /*菜单第1项完成：创建一个仅含头结点的空链表，如果创建成功，输出创建空链表成功， 返回头结点的指针，否则输出创建空链表失败，退出程序运行。*/ link_node_t* create_empty_link_table(void) { 	link_node_t* ptmp = NULL; 	ptmp = (link_node_t*)malloc(sizeof(link_node_t)); 	if (ptmp) 	{ 		printf(">>>创建空链表成功\n"); 		return ptmp; 	} 	else 	{ 		printf(">>>创建空链表失败\n"); 		exit(EXIT_FAILURE); 	} 	 }   /*菜单第2项完成：依次输入一组整数，以-1作为结束的标志，  创建由这些输入数据所形成的带头结点的单链表，返回头结点的指针。*/ link_node_t* add_array_to_link_table(link_node_t* phead) { 	int tmp = 0; 	link_node_t* ptmp = NULL; 	link_node_t* ptmp2 = phead; 		 	printf("请输入一组整数(-1结尾): "); 	 	while (1) 	{ 		scanf("%d", &tmp); 		if (-1 == tmp) 		{ 			break; 		}	 		//insert the node to link table 		insert_element_to_link_table(phead, tmp); 	} 	 	return phead; }  /* 菜单第3项完成：输入一个整数。将这个数插入在第2项建立的链表的链尾， 并输出整个链表中的数据信息。*/ void insert_one_int_to_link_table(link_node_t* phead) { 	int tmp; 	 	printf("请输入一个整数: "); 	scanf("%d", &tmp); 	insert_element_to_link_table(phead, tmp); 	printf(">>>整个链表中的数据信息:\n"); 	print_link_table(phead); 	 }  /*菜单第4项完成：输入一个整数，删除这个数在第3项完成后的链表中的所有出现，并  输出删除后链表的数据信息。 */ void delete_one_int_form_link_table(link_node_t* phead) { 	link_node_t* ptmp, *ptmp2; 	int value; 	ptmp = phead; 	 	printf("请输入要删除的整数: "); 	scanf("%d", &value); 	 	while ((ptmp != NULL) && (ptmp->next != NULL)) 	{ 		ptmp2 = ptmp->next; 		 		if (value == ptmp2->value) 		{//delete the node 			ptmp->next = ptmp2->next; 			free(ptmp2);	 		} 		else 		{ 			ptmp = ptmp->next; 		} 	} 	  	printf(">>>整个链表中的数据信息:\n"); 	print_link_table(phead);	 }  /* 菜单第5项完成：将第4项完成后的链表中的结点逆置，并输出。*/ void reverse_node_in_link_table(link_node_t* phead) { 	link_node_t* ptmp, *ptmp2, *ptmp3; 	 	if (NULL == phead) 	{ 		printf("请先创建一个链表\n"); 		return; 	} 	 	ptmp = phead->next; 	if (NULL == ptmp) 	{ 		printf("空链表\n"); 		return; 	} 	ptmp2 = ptmp->next; 	if (NULL == ptmp2) 	{// just have one node 		printf(">>>逆序后整个链表中的数据信息:\n"); 		print_link_table(phead); 		return; 	} 	ptmp3 = ptmp2->next; 	if (NULL == ptmp3) 	{// just have two nodes 		ptmp->next = NULL; 		ptmp2->next = ptmp; 		phead->next = ptmp2; 		printf(">>>逆序后整个链表中的数据信息:\n"); 		print_link_table(phead); 		return; 	} 	 	ptmp->next = NULL; 	ptmp2->next = ptmp;  	while (ptmp3) 	{//reverse 		ptmp = ptmp3->next; 		ptmp3->next = ptmp2; 	 //next loop 		ptmp2 = ptmp3; 		ptmp3 = ptmp; 	} 	phead->next = ptmp2; 	 	printf(">>>逆序后整个链表中的数据信息:\n"); 	print_link_table(phead);	 }  ///////////////////////////////////////////////////////////////// int main(void) { 	int option; 	link_node_t* phead = NULL; 	 	while (1) 	{ 		show_menu(); 		option = get_input(); 		 		switch (option) 		{ 		case 1: 			phead = create_empty_link_table(); 			break; 		case 2: 			phead = add_array_to_link_table(phead); 			break; 		case 3: 			insert_one_int_to_link_table(phead); 			break; 		case 4: 			delete_one_int_form_link_table(phead); 			break; 		case 5: 			reverse_node_in_link_table(phead); 			break; 		case 6: 			printf(">>>退出程序...\n"); 			free_all_node_in_link_table(phead); 			return 0; 		default: 			printf(">>>无效的选项!!!\n"); 			break; 		} 	}  }