Chaos 链表2.0 简单单链表操作的一站式实现

链表2.0

#include<stdio.h>
#include<stdlib.h> 

struct node {
//	int sign;
	int value;
	struct node *next;
};
//头插法
struct node *head_add(struct node *p) 
{	int n_value;
	scanf("%d",&n_value);
	struct node *t_node;
	t_node=(struct node*)malloc(sizeof(struct node));
	if(t_node==NULL)
	{
		printf("Error\n");
		exit(EXIT_FAILURE);
	} 
	t_node->value=n_value;
	if(p==NULL) t_node->next=NULL;
	else t_node->next=p;
	return t_node;
	
} 
 //尾插法 
 struct node *tail_add(struct node *p)
{	int n_value;
	scanf("%d",&n_value);
	struct node *t_node,*head=NULL;
	t_node=(struct node*)malloc(sizeof(struct node));
	if(t_node==NULL)
	{
		printf("Error\n");
		exit(EXIT_FAILURE);
	} 
	t_node->value=n_value;
	t_node->next=NULL;
	if(p!=NULL) p->next=t_node;
	return t_node;
} 
//定位插入结点
struct node *insert_node(struct node *head)
{	struct node *cur,*prev;
	int n;
	printf("请输入需要插入结点的位置(即其后一个结点value):");
	scanf("%d",&n);
	for(prev=NULL,cur=head;
		cur->value!=n&&cur!=NULL;
		prev=cur,cur=cur->next);
	
	if(cur==NULL)
	{	
		printf("Error:无此节点\n");
		return head;
	}
	else 
	{	int n_value;
		struct node *t_node;
		printf("请输入新结点value:");
		scanf("%d",&n_value);		
		t_node=(struct node*)malloc(sizeof(struct node));
		if(t_node==NULL)
		{
			printf("Error\n");
			exit(EXIT_FAILURE);
		} 
		t_node->value=n_value;
		t_node->next=cur;
		if(prev==NULL) head=t_node;
		else prev->next=t_node;
		return head;
	}	 
} 
//结点删除
struct node * delete_node(struct node *head)
{
	int n;
	printf("请输入需删除结点value;");
	scanf("%d",&n);
	struct node *cur,*prev;
	
	for(cur=head,prev=NULL;
		cur->value!=n&&cur!=NULL;
		prev=cur,cur=cur->next);
		
	if(cur==NULL) 
	{	
		printf("Error:无此节点\n");
		return head;
	}
	if(prev==NULL) head=cur->next;
	else prev->next=cur->next;
	free(cur);
	return head;
}
//链表打印
void print(struct node *head)
{
	for(;head!=NULL;head=head->next)
	printf(" %-3d",head->value);
	printf("\n");
} 
//链表冒泡排序
void bubble_sort(struct node *head,int n)
{	
	int t,i;
	struct node *p;
	for(i=1;i<=n;i++)
	{
		for(p=head;p->next!=NULL;p=p->next)
			if(p->value>p->next->value)
			{
				t=p->value;
				p->value=p->next->value;
				p->next->value=t;
			}
	}
} 

int main()
{
	struct node *p=NULL,*head;
	int item,n,i,tuichu,time=1;
	printf("请选择头插法或尾插法建表\n"
		   "************************\n"
		   "**      1.头插法      **\n"
		   "**      2.尾插法      **\n"
		   "************************\n"
		   "请输入序号:");
	scanf("%d",&item);
	while(item!=1&&item!=2)
	{
		printf("Error:非法输入\n"
			   "请重新输入:");
		scanf("%d",&item);		   
	}
	printf("请输入结点个数:");
	scanf("%d",&n); 
	printf("请为每个结点赋值(空格隔开):");	
	switch(item){
		case 1: for(i=1;i<=n;i++)
					p=head_add(p);
				head=p;
				break;
		case 2:	for(i=1;i<=n;i++)
				{
					p=tail_add(p);
					if(i==1) head=p;
				}
				break;
		}				
	printf("建表完毕.\n");
	printf("第%d次打印链表:",time);
    print(head);
	time++;
	while(1)
	{
		printf("****************************\n"
			   "**      请选择链表操作    **\n"
			   "**     1.头插结点         **\n"
			   "**     2.尾插结点         **\n"
			   "**     3.定位插入结点     **\n"
			   "**     4.结点删除         **\n"
			   "**     5.链表冒泡排序     **\n" 
			   "**     6.退出             **\n"
			   "****************************\n"
			   "请输入序号:");
		scanf("%d",&item);
		while(item!=1&&item!=2&&item!=3&&item!=4&&item!=5&&item!=6)
		{
			printf("Error:非法输入\n"
				   "请重新输入:");
			scanf("%d",&item);		   
		}
		switch (item){
			case 1:	printf("请输入新结点value:");
					head=head_add(head);
					n++;
					break;
			case 2:	printf("请输入新结点value:");
					for(p=head;p->next!=NULL;p=p->next);
						p=tail_add(p);
					n++;
					break;
			case 3:	head=insert_node(head);
					n++;
					break;
			case 4: head=delete_node(head);
					n--;
					break;
			case 5:	bubble_sort(head,n);
					break;
			case 6:	exit(EXIT_SUCCESS);
		}
		printf("操作完成\n");
		printf("第%d次打印链表:",time);	
		print(head);
		time++; 
	
		printf("**********************\n"
			   "**      请选择:    **\n"
			   "**    1.继续操作    **\n"
			   "**    2.退出        **\n"
			   "**********************\n"
			   "请输入序号:");
		scanf("%d",&tuichu);
		while(tuichu!=1&&tuichu!=2)
		{
			printf("Error:非法输入\n"
				   "请重新输入:");
			scanf("%d",&tuichu);
		}
		if(tuichu==2) break;				   
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值