链表八大操作

链表八大操作 2018年12月22日
*以下内容仅供娱乐,欢迎随时探讨,请多指教!
有如下的结构体:

typedef struct link_list
{
	int num;
	char sex[20];
	char name[30];
	struct link_list *next;
}STU;

利用此结构体设计单链表,并在单链表上完成如下操作:
(1) 创建链表。
(2) 输出链表。
(3) 链表查找。
(4) 链表插入。
(5) 链表删除。
(6) 链表逆序。
(7) 链表合并。
(8) 链表拆分。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define N sizeof(struct link_list)
//结构体类型 
typedef struct link_list {
	int num;
	char sex[20];
	char name[30];
	struct link_list *next;
} STU;
void chaifen(STU *list);//按男女拆分链表函数 
STU *merge(STU *list1,STU *list2);//合并链表函数 
STU *reverse(STU*head);//反转链表函数 
STU *del(STU*head,int num);//插入链表函数
STU *insertbynum(STU*head,int num);//插入链表函数
STU *search(STU *head ,int num);//查找链表函数 
void output(STU *head);//输出链表函数 
STU *creat();//创建链表函数
STU *man=NULL,*woman=NULL;
int main () {
	int ch;
	int flag1=0,flag2=0;
	STU *p,*q=NULL,*t;
	int m,j;
back:
	printf("1.创建链表\n");
	printf("2.输出链表\n");
	printf("3.查找链表\n");
	printf("4.插入链表\n");
	printf("5.删除链表\n");
	printf("6.倒序链表\n");
	printf("7.合并链表\n");
	printf("8.拆分链表\n");
	printf("9.输出拆分链表\n");
	printf("10.输出查找人的信息\n");
	printf("你的选择是 :");
	scanf("%d",&m);
	switch (m) {
		case 1 :
			p=creat();
			flag1=1;
			break;
		case 2 :
			if(!flag1) {
				system("cls");
				printf("请先建立链表\n");
				goto back;
			}
			system("cls");//实现清屏操作
			printf("输出结果为\n");
			output(p);
			break;
		case 3 :
			if(!flag1) {
				system("cls");
				printf("请先建立链表\n");
				goto back;
			}
			system("cls");
			printf("输入要查找的学号\n");
			scanf("%d",&j);
			t=search(p,j);
			flag2=1;
			break;
		case 4 :
			if(!flag1) {
				system("cls");
				printf("请先建立链表\n");
				goto back;
			}
			system("cls");
			printf("请输入要插入的学号\n");
			scanf("%d",&j);
			p=insertbynum(p,j);
			break;
		case 5 :
			if(!flag1) {
				system("cls");
				printf("请先建立链表\n");
				goto back;
			}
			system("cls");
			printf("请输入要删除的学号\n");
			scanf("%d",&j);
			p=del(p,j);
			break;
		case 6 :
			if(!flag1) {
				system("cls");
				printf("请先建立链表\n");
				goto back;
			}
			system("cls");
			p=reverse(p);
			break;
		case 7 :
			if(!flag1) {
				system("cls");
				printf("请先建立链表\n");
				goto back;
			}
			system("cls");
			printf("建立第二个链表\n");
			q=creat();
			p=merge(p,q);
			break;
		case 8 :
			if(!flag1) {
				system("cls");
				printf("请先建立链表\n");
				goto back;
			}
			system("cls");
			chaifen(p);
			break;
		case 9:
			if(!flag1) {
				system("cls");
				printf("请先建立链表\n");
				goto back;
			}
			system("cls");
			printf("man is \n");
			output(man);
			printf("woman is\n");
			output(woman);
			break;
		case 10 :
			system("cls");
			if(!flag1||!flag2) {
				system("cls");
				printf("请先建立链表或查找内容\n");
				goto back;
			}
			printf("查找内容为 :\n");
			printf("%d %s %s\n",t->num,t->sex,t->name);
			break;
		default :
			system("cls");
			printf("请先建立链表或选择正确的数字\n");
			goto back;
	}
	printf("已完成操作,输入1继续执行否则结束\n");
	scanf("%d",&ch);
	if (ch == 1) {
		system("cls");
		goto back;
	}
	return 0;
}
//创建链表函数 
STU *creat() {
	STU *p,*q,*head=NULL;
	int num;
	system("cls");
	printf("请输入学号,以小于0结尾\n");
	scanf("%d",&num);
	if (num<=0) {
		return head;
	}
	while (num>0) {
		p=(STU*)malloc(N);
		p->num=num;
		printf("请输入性别和姓名(以空格或tab或回车结束)\n");
		scanf("%s%s",p->sex,p->name);
		if(head==NULL) {
			head=p;
		} else {
			q->next=p;
		}
		q=p;
		system("cls");
		printf("请输入学号,以小于0结尾\n");
		scanf("%d",&num);
	}
	system("cls");
	q->next=NULL;
	return head;
}
//输出链表函数 
void output(STU *head) {
	while (head) {
		printf("%d %s %s\n",head->num,head->sex,head->name);
		head=head->next;
	}
}
//查找链表函数 
STU *search(STU *head ,int num) {
	if(!head) {
		return head;
	}
	while (head&&head->num!=num) {
		head=head->next;
	}
//	printf("%d%s%s\n",head->num,head->sex,head->name);
	return head;
}
//插入链表函数 
STU *insertbynum(STU*head,int num) {
	STU *p,*q,*s;
	s=(STU*)malloc(N);
	s->num=num;
	printf("请输入性别和姓名(以空格或tab或回车结束)\n");
	scanf("%s%s",s->sex,s->name);
	if(!head) {
		head=s;
		s->next=NULL;
		return head;
	}
	if(head->num>num) {
		s->next=head;
		head=s;
		return head;
	}
	q=head,p=head->next;
	while (p&&p->num<num) {
		q=p;
		p=p->next;
	}
	s->next=q->next;
	q->next=s;
	return head;
}
//删除链表函数 
STU *del(STU*head,int num) {
	STU *p,*q;
	if(!head) {
		return head;
	}
	if(head->num==num) {
		p=head;
		head=head->next;
		free(p);
		return head;
	}
	q=head,p=head->next;
	while (p&&p->num!=num) {
		q=p;
		p=p->next;
	}
	if(p->num==num) {
		q->next=p->next;
		free(p);
	}
	return head;
}
//反转链表函数
STU *reverse(STU*head) {
	STU *p,*q;
	if (!head) {
		return head;
	}
	q=p=head->next;
	head->next=NULL;
	while (p) {
		p=p->next;
		q->next=head;
		head=q;
		q=p;
	}
	return head;
}
//合并链表函数 
STU *merge(STU *list1,STU *list2) {
	STU *head_all=NULL,*p,*q,*s=NULL;
	head_all=s;
	p=list1;
	q=list2;
	if (!list1) {
		return list2;
	}
	if(!list2) {
		return list1;
	}
	while (list1 && list2) {
		if(list1->num <list2->num) {
			p=p->next;
			if (!s) {
				head_all=s=list1;
			} else {
				s->next=list1;
				s=s->next;
			}
			list1=p;
		} else {
			q=q->next;
			if (!s) {
				head_all=s=list2;
			} else {
				s->next=list2;
				s=s->next;
			}
			list2=q;
		}
	}
	if (!list1) {
		s->next=list2;
	} else {
		s->next=list1;
	}
	return head_all;
}
//按男女拆分链表函数 
void chaifen(STU *list) {
	STU *p,*m=NULL,*w=NULL;
	p=list;
	while (list) {
		p=p->next;
		if (!strcmp(list->sex,"man")) {
			if (!man) {
				man=m=list;
			} else {
				m->next=list;
				m=m->next;
			}
		} else if (!strcmp(list->sex,"woman")) {
			if (!woman) {
				woman=w=list;
			} else {
				w->next=list;
				w=w->next;
			}
		} else {
			;
		}
		list=p;
	}
	if (m) {
		m->next=NULL;
	}
	if(w) {
		w->next=NULL;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43310774/article/details/85163100