链表一系列操作

总共分为10点
/(1)输出顺序表中的所有元素;
(2)按序号查找指定元素,即输出顺序表中的第i个元素;
(3)按值查找指定元素,即输出顺序表中值为x的元素的序号;
(4)在指定位置插入元素,即在第i个元素前面插入值为x的元素;
(5)删除指定元素,即删除第i个元素;
(6)删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
(7)单值化操作,即删除表中重复元素中的多余元素,只保留其中序号最小的一个,例如,顺序表(2,4,4,3,2,4)单值化后的结果为(2,4,3);
(8)简单划分操作,即将顺序表 (a1,a2,… ,an) 重新排列为以指定元素a1为界的两部分:a1前面的值均小于等于a1,a1后面的值均大于a1;
(9)采用直接插入法将顺序表排列为升序序列,参见教材P236对直接插入排序法基本操作步骤的讲解;
(10)销毁顺序表并退出。
/

头文件

#include<stdio.h>
#define ok 1
#define error 0
#define MAXSIZE 100
typedef int status;                                                                                                                                                                                       

typedef struct a
{
	status length;
	status *p;
}sqlist;

创建链表

status cj(sqlist &L)							//创建链表			
{
	L.p=new status (MAXSIZE); 
	L.length = 0;
	if(!L.length )
	return error;
	L.length = 0;
	return ok;
 }

链表的初始化

status csh(sqlist &L,status n)					//初始化 
 {
 	status i;
 	printf("请输入要输入的值\n"); 
 	for(i=0;i<n;i++)
 	scanf("%d",L.p[i]);
 	return ok;
  } 

1.输出链表中所有元素

status shuchu(sqlist &L)											//输出所有元素 
{
	int i;
	for(i=0;i<L.length-1;i++)
	{
		printf("%d\n",L.p[i]);
	}
	return ok;
}	

2.输出链表中第n个元素

status sci(sqlist L,status n)					//输出i 
{
	int i;
	if(i>L.length)
	{
		printf("错误");
		return error;
	}
	else
	printf("%d",a.p[n-1]);
	return ok;
}

3.按值输出元素

status azsc(sqlist L,status n)				//按值输出元素 
{
	int i;
	for(i=0;i<L.length-1,i++)
	{
		if(L.p[i]==n)
		{
			printf("为第%d个元素\n",i+1);
			return ok;
		}
		else
		{
			printf("没有您要查找的值\n");
			return error;	
		}
	}
} 

4.插入元素

status crys(sqlist &L,status n,status x)				//插入元素 
{
	L.length++;
	int i=L.length;
	if(n<0||n>L.length-1)
	{
		return error;
	}
	else
	{
		for(;i>n-2;i--)
		{
			L.p[i]=L.p[i-1]; 
	 	} 
		a[n-1]=x;
	} 
	return ok;
} 

5.删除第n个元素

status scys(sqlist &L,status n)							//删除第n个元素 
{
	int i;
	if(n<0||n>L.length+1)
	{
		printf("不存在\n");
		return error;
	}
	else
	{
		for(i=n;i<L.length;i++)
		{
			L.p[n-1]=L.p[n];	
		}	
		L.length--;
	}
	return ok;
}

6.删除值在一个范围内的数

stasus scfwys(sqlist &L)									//删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
{
	status cj(sqlist &L)	
	int i,q=0;
	sqlist a;
	cj(sqlist &a);
	for(i=0;i<L.length;i++)
	{
		if(L.p[i]>=x&&L.p[i]<=y)
		{
			a.p[q]=L.p[i];
			q++;
		}
	}
	for(i=0;i<q+1;i++)
	{
		L.p[i]=a.p[i];
	}
	L.length=q+1;
	return ok;
}

7.删除重复元素

status sccfys(sqlist &L)   				//删除重复元素
{
	status scys(sqlist &L,Status n)
	int i,a;
	for(i=1,i<L.length;i++)
	{
		for(a=0;a<i;a++)
		{
			if(L.p[i]==L.p[a])
			{
				scys(L,i+1);
			}
		}
	}
	return ok;
} 

8.排序分界

status px(sqlist &L,status a)     				//排序分界 
{
	int q=a,*w,z,x;
    *w=new status(MAXSIZE);					//q是值a  w[]是新数组   L->p[]是原数组 
	w=q;									//x为末尾 z为开始 
	z=0;x=L.length-1;
	for(i=0;i<L.length;i++)
	{
		if(q<L->p[i])
		{
			w[x]=L.p[i];
			x--; 
		}
		else
		{
			w[z+1]=w[z];
			w[z]=L.p[i];
			z++;			
		}
	}
	return ok;
}

9.直接插入法升序

status sx(sqlist &L) 							//直接插入法升序 
{
	int i;
	for(i=1;i<L.length-1;i++)
	{
		for(a=0;a<i;a++)
		{
			if(L.p[i]<L.p[a])
			{
				q=L.p[i];
				for(w=i;w<a+2;w--)
				{
					L.p[w]=L.p[w-1]; 
				}
				L.p[a]=q;
			}
		}
	}
	return ok;
 } 
 

10.销毁

Status xh(LinkList &L)
{
	LNode *q;
	while(L!=NULL)
	{
		q=L;
		L=L->next;
		delete	q;
	}
	return ok;
}

菜单

status menu(status n,sqlist &L)									//菜单 
{
	status cj(sqlist &L);							//创建链表
	status csh(sqlist &L,status n);					//初始化 				
	status sci(sqlist L,status n);					//输出i 
	status azsc(sqlist L,status n);					//按值输出元素 
	status crys(sqlist &L,status n,status x);		//插入元素
	status scys(sqlist &L,status n);					//删除第n个元素 
	status scfwys(sqlist &L);						//删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
	status sccfys(sqlist &L);   						//删除重复元素
	status px(sqlist &L,int a);     					//排序分界 
	status sx(sqlist &L); 							//直接插入法升序
	status shuchu(sqlist &L);						//输出所有元素 
	status xh(sqlist &L); 							//销毁 
	printf("1:输出顺序表中的所有元素\n");
	printf("2:输出顺序表中的第i个元素\n");
	printf("3:输出顺序表中值为x的元素的序号\n");
	printf("4:在第i个元素前面插入值为x的元素\n");
	printf("5:删除第i个元素\n");
	printf("6:删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n)\n");
	printf("7:单值化操作,删除表中重复元素中的多余元素\n");
	printf("8:简单划分操作,将顺序表 (a1,a2,... ,an) 重新排列为以指定元素a1为界的两部分\n");
	printf("9:采用直接插入法将顺序表排列为升序序列");
	printf("10:销毁顺序表并退出\n");
	printf("请输入您想要做的事对应的序号");
	scanf("%d",n);
	
	int i,q;		switch (n)     				//int main里面去 
	{
		case 1: shuchu(L); 	
				menu(n,L);	break;
		case 2: printf("您想输出第几个元素\n");
				scanf("%d",&i);
				sci(L,i);
				menu(n,L);	break;
		case 3: printf("值为多少\n");
			 	scanf("%d",&i);
			 	azsc(L,i);
			 	menu(n,L);	break;
		case 4: printf("第几个元素 值为多少\n");
				scanf("%d %d",&i,&q);
				crys(&L,i,q);
				menu(n,L);	break;
		case 5: printf("删除第几个元素\n");
				scanf("%d",&i);
				scys(&L,i);
				menu(n,L);	break;
		case 6: printf("删除范围在x~y内的数x是多少y是多少\n");
				scanf("%d %d",&i,&q);
				scfwys(&L,i,q);
				menu(n,L);	break;
		case 7: sccfys(&L);
				shuchu(L);
				menu(n,L);	break;
		case 8: printf("a1为多少\n");
				scanf("%d",&i);
				px(&L,i);
				shuchu(L);
				menu(n,L);	break;
		case 9: sx(&L);
				shuchu(L);
				menu(n,L);	break;
		case 10: xh(&L);
				 break;
	}
	return ok;
}

主函数

int main()									//主函数 
{
	status cj(sqlist &L);							//创建链表
	status csh(sqlist &L,status n);						//初始化 
	status menu(status n);							//菜单 
	status sc(sqlist L,status n);					//删除 
	status sci(sqlist L,status n);					//输出i 
	status azsc(sqlist L,status n);					//按值输出元素 
	status crys(sqlist &L,status n,status x);		//插入元素
	status scys(sqlist &L,status n);					//删除第n个元素 
	stasus scfwys(sqlist &L);						//删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);

	status sccfys(sqlist &L);  						//删除重复元素
	status px(sqlist &L,int a);     					//排序分界 
	status sx(sqlist &L); 							//直接插入法升序

	status shuchu(sqlist &L);						//输出所有元素 
	status xh(sqlist &L); 							//销毁 
	
	int i,q,w;
	status n;
	sqlist L;
	cj(&L);
	printf("要存几个值\n");
	scanf("%d",&w);
	csh(&L,w);
	menu(n,L);
	return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值