欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

顺序表(线性表的顺序存储结构)及C语言实现

程序员文章站 2022-05-21 11:49:05
...

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 20
#define initSize 10
typedef int ElemType;
typedef struct{
	ElemType *data;
	int length;
}SeqList;

SeqList initList(){
	SeqList L;
	L.data=(ElemType*)malloc(sizeof(ElemType)*initSize);
	L.length=0;
	return L;
}

void display(SeqList list){
	int i;
	for(i=0;i<list.length;i++){
		printf("%d\n",list.data[i]);
	}
}
//插入
SeqList insert(SeqList L,int i,ElemType e){
	int j;
	if(i<1||i>L.length+1){
		return L;
	}
	if(L.length>initSize){
		printf("数据满了");
		return L;
	}
	
	for(j = L.length;j>=i;j--){
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=e;
	L.length++;
	return L;
}
//删除
SeqList delList(SeqList L,int i,ElemType e){
	int j;
	if(i<1||i>L.length){
		return L;
	}
	for(j=i;j<L.length;j++){
		L.data[j-1]=L.data[j];
	}
	L.length--;
	return L;
}
//查询
int select(SeqList L,ElemType e){
	int i;
	for(i=0;i<L.length;i++){
		if(L.data[i]==e){
			return i+1;
		}
	}
	return -1;
}
//更新
SeqList update(SeqList L,int i ,ElemType e){
	int j;
	if(i<1||i>L.length+1){
		return L;
	}
	for(j=0;j<L.length;j++){
		L.data[i-1]=e;
	}
	return L;
}
int main(void)
{	
	int i;
	SeqList list = initList();

	for(i =1;i<=6;i++){
		list.data[i-1]=i;
		list.length++;
	}
	printf("原始数据\n");
	display(list);
	printf("在第三个位置插入数据50\n");
	list = insert(list,3,50);
	display(list);
	printf("在第三个位置删除数据50\n");
	list = delList(list,3,50);
	display(list);
	printf("查找5元素%d",select(list,5));

	printf("在第五个位置数据为50\n");
	list = update(list,5,50);
	display(list);
	getchar();
	return 0;
}
  1. 参考https://www.jianshu.com/p/f4cca5ce055a
  2. 我们知道常数项对函数的增长速度影响并不大,所以当 T(n) = c,c 为一个常数的时候,我们说这个算法的时间复杂度为 O(1);如果 T(n) 不等于一个常数项时,直接将常数项省略。
比如
第一个 Hello, World 的例子中 T(n) = 2,所以我们说那个函数(算法)的时间复杂度为 O(1)。
T(n) = n + 29,此时时间复杂度为 O(n)。
  1. 我们知道高次项对于函数的增长速度的影响是最大的。n^3 的增长速度是远超 n^2 的,同时 n^2 的增长速度是远超 n 的。 同时因为要求的精度不高,所以我们直接忽略低此项。
比如
T(n) = n^3 + n^2 + 29,此时时间复杂度为 O(n^3)。
  1. 因为函数的阶数对函数的增长速度的影响是最显著的,所以我们忽略与最高阶相乘的常数。
比如
T(n) = 3n^3,此时时间复杂度为 O(n^3)。

综合起来:如果一个算法的执行次数是 T(n),那么只保留最高次项,同时忽略最高项的系数后得到函数 f(n),此时算法的时间复杂度就是 O(f(n))。为了方便描述,下文称此为 大O推导法。



作者:raymondCaptain
链接:https://www.jianshu.com/p/f4cca5ce055a
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

王道数据结构书第18页的一些习题

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 20
#define initSize 30
typedef int ElemType;
typedef struct{
	ElemType *data;
	int length;
}SeqList;

SeqList initList(){
	SeqList L;
	L.data=(ElemType*)malloc(sizeof(ElemType)*initSize);
	L.length=0;
	return L;
}

void display(SeqList list){
	int i;
	for(i=0;i<list.length;i++){
		printf("%d\n",list.data[i]);
	}
}
//插入
SeqList insert(SeqList L,int i,ElemType e){
	int j;
	if(i<1||i>L.length+1){
		return L;
	}
	if(L.length>initSize){
		printf("数据满了");
		return L;
	}
	
	for(j = L.length;j>=i;j--){
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=e;
	L.length++;
	return L;
}
//删除
SeqList delList(SeqList L,int i,ElemType e){
	int j;
	if(i<1||i>L.length){
		return L;
	}
	for(j=i;j<L.length;j++){
		L.data[j-1]=L.data[j];
	}
	L.length--;
	return L;
}
//查询
int select(SeqList L,ElemType e){
	int i;
	for(i=0;i<L.length;i++){
		if(L.data[i]==e){
			return i+1;
		}
	}
	return -1;
}
//更新
SeqList update(SeqList L,int i ,ElemType e){
	int j;
	if(i<1||i>L.length+1){
		return L;
	}
	for(j=0;j<L.length;j++){
		L.data[i-1]=e;
	}
	return L;
}
//第一题
SeqList del_min(SeqList L){
	int i ,pos=0;
	ElemType min;
	if(L.length==0){
		return L;
	}
	min = L.data[0];
	for(i=0;i<L.length;i++){
		if (L.data[i]<min){
			min = L.data[i];
			pos = i;
		}
	}
	L.data[pos]=L.data[L.length-1];
	return L;
	
}
//逆置
SeqList reverse(SeqList L){
	ElemType temp;
	int i ;
	for(i=0;i<L.length/2;i++){
		temp = L.data[i];
		L.data[i]=L.data[L.length-1-i];
		L.data[L.length-1-i]=temp;
	}
	return L;
}
//第三题
SeqList del_k(SeqList L,ElemType x){
	int k=0;
	int i;
	for (i=0;i<L.length;i++){
		if (L.data[i]!=x){
			L.data[k]=L.data[i];
			k++;
		}
	}
	L.length=k;
	return L;
}
//第四题
SeqList del_st(SeqList L,ElemType s,ElemType t){
	int i,j,k=0;
	if(s>t){
		return L;
	}
	if (L.length==0){
		printf("顺序表为空");
		return L;
	}
	for (i=0;i<L.length;i++){
		if(L.data[i]>s&&L.data[i]<t){
			
			k++;
		}else{
			L.data[i-k]=L.data[i];

		}
	}
	L.length-=k;
	return L;
}
//去掉相同
SeqList del_same(SeqList L){
	int i=0;
	int j=1;
	for(;j<L.length;j++){
		if(L.data[i]!=L.data[j]){
			i++;
			L.data[i]=L.data[j];
		}
	}
	L.length=i+1;
	return L;
}
//两个顺序表排序
SeqList sortSeq(SeqList L1,SeqList L2,SeqList L3){
	int i=0,j=0,k=0;
	if(L1.length+L2.length>=initSize){
		return L1;
	}
	while(i<L1.length&&j<L2.length){
		if(L1.data[i]<L2.data[j]){
			L3.data[k++]=L1.data[i++];
		}else{
			L3.data[k++]=L2.data[j++];
		}
	}
	while(i<L1.length){
		L3.data[k++]=L1.data[i++];
	}
	while(j<L2.length){
		L3.data[k++]=L2.data[j++];
	}
	L3.length=k;
	printf("L3length%d,k=%d",L3.length,k);
	return L3;
}
//第九题
SeqList findXandExchange(SeqList L, ElemType x){
	int left =0;
	int right = L.length-1;
	int mid;
	int i;
	ElemType temp;
	while(left<=right){
		mid=(left+right)/2;
		if(L.data[mid]==x){
			break;
		}
		if (L.data[mid]<x){
		left = mid+1;
		}else{
		right = mid-1;
		}
	}
	if(L.data[mid]==x&&mid!=L.length-1){
		temp = L.data[mid];
		L.data[mid]=L.data[mid+1];
		L.data[mid+1]=temp;
	}
	if(left>right){
		for(i=L.length-1;i>right;i--){
			L.data[i+1]=L.data[i];
		}
		L.data[i+1]=x;
		L.length++;
	}
	return L;
}

char * reverseChar(char c[],int left,int right){
	int i ,j;
	char temp;
	int length = strlen(c);
	i = left;
	j= right;
	
	for(;i<(right+left)/2;i++,j--){
		temp = c[i];
		c[i]=c[j];
		c[j]=temp;

	}
	return c;
}
char * converse(char c[],int length,int p ){
	reverseChar(c,0,p-1);
	printf("第一次%s",c);
	reverseChar(c,p,length-1);
	printf("第2次%s",c);
	reverseChar(c,0,length-1);
	printf("第3次%s",c);
	return c;
}
void test(int t){
	t=5;
}
int main(void)
{	
	int i;
	char str[]= "abcdefgh";
	int t=10;
	
	SeqList list1 = initList();
	SeqList list2 = initList();
	SeqList list3 = initList();
	int left = 0;
	int right = strlen(str);
	int mid = (left + right)/2;
	char temp;
	printf("%d",t);
	printf("test\n");
	converse(str,right,3);
	printf("\n");
	
	/*for (;left<mid;left++,right--){
		temp = str[left];
		str[left]= str[right];
		str[right]=temp;
	}*/
	/*while(left<=right){
		temp = str[left];
		str[left]= str[right];
		str[right]=temp;
		left++;
		right--;
	}*/
	for (i=0;i<=mid;i++){
		temp = str[i];
		str[i]=str[right-i];
		str[right-i] = temp;
	}
	printf(str);

	for(i =1;i<=10;i++){
		list1.data[i-1]=i;
		list1.length++;
	}
	for(i =1;i<=10;i++){
		list2.data[i-1]=i*2;
		list2.length++;
	}
	printf("原始数据1\n");
	display(list1);
	printf("原始数据2\n");
	display(list2);
	printf("第九题");
	list2= findXandExchange(list2,11);
	display(list2);
	//printf("排序数据3\n");
	//list3 = sortSeq(list1,list2,list3);
	//display(list3);
	//printf("在第三个位置插入数据50\n");
	//list = insert(list,2,2);
	//list = insert(list,3,2);
	//list = insert(list,7,5);
	//display(list);
	//printf("在第三个位置删除数据50\n");
	//list = delList(list,3,50);
	//display(list);
	//printf("查找5元素%d",select(list,5));

	//printf("在第五个位置数据为50\n");
	//list = update(list,5,50);
	//display(list);


	/*printf("第一题\n");
	list = del_min(list);
	display(list);
	printf("第二题逆置\n");
	list = reverse(list);
	display(list);*/
	//printf("第三题\n");
	//list = del_k(list,6);
	//display(list);
	//printf("第四题st\n");
	//list = del_st(list,2,5);
	//display(list);
	/*printf("第五题same\n");
	list = del_same(list);
	display(list);*/
	getchar();
	return 0;
}