五月计划 --- 数据结构day3

 

     1	#ifndef __STATIC_SEQ__
     2	#define __STATIC_SEQ__
     3	#include
     4	#include
     5	#define MAX 40
     6	typedef int datatype;
     7	typedef struct
     8	{
     9		int len;
    10		datatype data[MAX];
    11	}seq,*snode;
    12	
    13	//创建顺序表
    14	seq * create_seq();
    15	//判空
    16	int list_empty(seq *s);
    17	//判满
    18	int list_full(seq *s);
    19	//添加元素
    20	int add_list(seq*s,datatype x);
    21	//遍历
    22	void output_list(seq*s);
    23	//任意位置插入
    24	int insert_node(seq*s,int i,datatype x);
    25	//任意位置删除
    26	datatype delete_node(seq*s,int i);
    27	//按位置修改
    28	int pos_change_node(seq*s,int i,datatype x);
    29	//按值修改
    30	int values_change(seq*s,datatype x,datatype y);
    31	//查询指定位置元素
    32	datatype query_value(seq*s,int i);
    33	//按值进行查找元素
    34	int list_search_value(seq*s,datatype x);
    35	//将顺序表排序,选择排序 0为降序1为升序
    36	void list_sort(seq*s ,int st);
    37	//顺序表去重
    38	int delete_revalue(seq*s);
    39	//扩容
    40	seq *expand(seq*s);
    41	//求最值
    42	datatype list_mvalue(seq*s,int flag);
    43	//顺序表反转
    44	int list_revers(seq *s);
    45	#endif
     1	#ifndef __STATIC_SEQ__
     2	#define __STATIC_SEQ__
     3	#include
     4	#include
     5	#define MAX 40
     6	typedef int datatype;
     7	typedef struct
     8	{
     9		int len;
    10		datatype data[MAX];
    11	}seq,*snode;
    12	
    13	//创建顺序表
    14	seq * create_seq();
    15	//判空
    16	int list_empty(seq *s);
    17	//判满
    18	int list_full(seq *s);
    19	//添加元素
    20	int add_list(seq*s,datatype x);
    21	//遍历
    22	void output_list(seq*s);
    23	//任意位置插入
    24	int insert_node(seq*s,int i,datatype x);
    25	//任意位置删除
    26	datatype delete_node(seq*s,int i);
    27	//按位置修改
    28	int pos_change_node(seq*s,int i,datatype x);
    29	//按值修改
    30	int values_change(seq*s,datatype x,datatype y);
    31	//查询指定位置元素
    32	datatype query_value(seq*s,int i);
    33	//按值进行查找元素
    34	int list_search_value(seq*s,datatype x);
    35	//将顺序表排序,选择排序 0为降序1为升序
    36	void list_sort(seq*s ,int st);
    37	//顺序表去重
    38	int delete_revalue(seq*s);
    39	//扩容
    40	seq *expand(seq*s);
    41	//求最值
    42	datatype list_mvalue(seq*s,int flag);
    43	//顺序表反转
    44	int list_revers(seq *s);
    45	#endif
ubuntu@ubuntu:03day$ 
ubuntu@ubuntu:03day$ cat -n static_seq_fun.c
     1	#include"static_seq.h"
     2	//创建顺序表表
     3	seq * create_seq()
     4	{
     5		seq * s = (seq *)malloc(sizeof(seq));
     6		if (!s)
     7		{
     8			printf("申请空间失败,建表失败!\n");
     9			return NULL;
    10		}
    11		else
    12		{
    13			printf("建表成功!\n");
    14			//memset(s->data,0,sizeof(s->data));
    15			s->len = 0;
    16			printf("初始化完成!\n");
    17		}
    18		return s;
    19	}
    20	
    21	//判空
    22	int list_empty(seq *s)
    23	{
    24		if (!s)
    25		{
    26			printf("未创建顺序表!\n");
    27			return 0;
    28		}
    29		return s->len == 0;
    30	}
    31	//判满
    32	int list_full(seq *s)
    33	{
    34		if (!s)
    35		{
    36			printf("未创建顺序表!\n");
    37			return 0;
    38		}
    39		return (s->len >= MAX);
    40	}
    41	
    42	//添加元素
    43	int add_list(seq*s,datatype x)
    44	{
    45		if (!s)
    46		{
    47			printf("申请空间失败,建表失败!\n");
    48			return 0;
    49		}
    50		if (list_full(s))
    51		{
    52			printf("表满,插个p!\n");
    53			return 0;
    54		}
    55		s->data[s->len] = x;
    56		(s->len)++;
    57		printf("第%d添加成功!\n",s->len);
    58		return 1;
    59	}
    60	
    61	//遍历
    62	void output_list(seq*s)
    63	{
    64		if (!s)
    65		{
    66			printf("创建表了吗?滚犊子!\n");
    67			return;
    68		}
    69		if (list_empty(s))
    70		{
    71			printf("表空,打印个锤子!\n");
    72			return;
    73		}
    74		int i;
    75		for (i=0;ilen;i++)
    76			printf("%d\n",s->data[i]);
    77		printf("输出完成!\n");
    78	}
    79	//任意位置插入
    80	int insert_node(seq*s,int i,datatype x)
    81	{
    82		if (!s)
    83		{
    84			printf("创建表了吗?滚犊子!\n");
    85			return 0;
    86		}
    87		if (list_full(s))
    88		{
    89			printf("没位置了兄弟,插个鬼哦!\n");
    90			return 0;
    91		}
    92		if (i-1>s->len || i<0)
    93		{
    94			printf("插你身上\n");
    95		}
    96		int j;
    97		for (j=s->len;j>i-1;j--)
    98			s->data[j] = s->data[j-1];
    99		s->data[i-1] = x;
   100		(s->len)++;
   101		printf("插入成功!\n");
   102		return 1;
   103	
   104	}
   105	//任意位置删除
   106	datatype delete_node(seq*s,int i)
   107	{
   108		if (!s)
   109		{
   110			printf("创建表了吗?滚犊子!\n");
   111			return 0;
   112		}
   113		if (list_empty(s))
   114		{
   115			printf("表空,把你删了!\n");
   116			return 0;
   117		}
   118		if (i>s->len || i<0)
   119		{
   120			printf("没有这个位置啊哥哥!\n");
   121		}
   122		int j;
   123		datatype x= s->data[i-1];
   124		for (j=i-1;jlen;j++)
   125			s->data[j]=s->data[j+1];
   126		(s->len)--;
   127		printf("已经删除第%d个数据:%d\n",i,x);
   128		return x;
   129	}
   130	//按位置修改
   131	int pos_change_node(seq*s,int i,datatype x)
   132	{
   133		if (!s)
   134		{
   135			printf("创建表了吗?滚犊子!\n");
   136			return 0;
   137		}
   138		if (list_empty(s))
   139		{
   140			printf("表空!\n");
   141			return 0;
   142		}
   143		if (i>s->len || i<0)
   144		{
   145			printf("没有这个位置啊哥哥!\n");
   146		}
   147		datatype data = s->data[i-1];
   148		s->data[i-1]=x;
   149		printf("第%d个元素修改前:%d,修改后:%d\n",i,data,s->data[i-1]);
   150	}
   151	//按值修改
   152	int values_change(seq*s,datatype x,datatype y)
   153	{
   154		if (!s)
   155		{
   156			printf("创建表了吗?滚犊子!\n");
   157			return 0;
   158		}
   159		if (list_empty(s))
   160		{
   161			printf("表空!\n");
   162			return 0;
   163		}
   164		int i;
   165		for (i=0;ilen;i++)
   166		{
   167			if (s->data[i] == y)
   168			{
   169				s->data[i] = x;
   170			}
   171		}
   172		printf("修改完成!\n");
   173		return 1;
   174	}
   175	//查询指定位置元素
   176	datatype query_value(seq*s,int i)
   177	{
   178		if (!s)
   179		{
   180			printf("创建表了吗?滚犊子!\n");
   181			return 0;
   182		}
   183		if (list_empty(s))
   184		{
   185			printf("表空!\n");
   186			return 0;
   187		}
   188		printf("第%d个元素是%d\n",i,s->data[i-1]);
   189		return s->data[i-1];
   190	}
   191	//按值进行查找元素
   192	int list_search_value(seq*s,datatype x)
   193	{
   194		if (!s)
   195		{
   196			printf("创建表了吗?滚犊子!\n");
   197			return 0;
   198		}
   199		if (list_empty(s))
   200		{
   201			printf("表空!\n");
   202			return 0;
   203		}
   204		int j;
   205		int flag=0;
   206		printf("第");
   207		for (j=0;jlen;j++)
   208		{
   209			if (s->data[j] == x)
   210			{
   211				printf("%d ",j+1);
   212				flag = 1;
   213			}
   214		}
   215		if (flag)
   216		{
   217			printf("个元素的值是%d\n",x);
   218		}
   219		else
   220		{
   221			printf("没找到!\n");
   222		}
   223		
   224		return 1;
   225	
   226	}
   227	//将顺序表排序,选择排序 0为降序1为升序
   228	void list_sort(seq*s ,int st)
   229	{
   230		if (!s)
   231		{
   232			printf("创建表了吗?滚犊子!\n");
   233			return;
   234		}
   235		if (list_empty(s))
   236		{
   237			printf("表空!\n");
   238			return;
   239		}
   240		int i,j;
   241		int id;
   242		for (i=0;ilen-2;i++)
   243		{
   244			id = i;
   245			for (j=i+1;jlen;j++)
   246			{
   247				if (s->data[id]data[j] && st == 0 || s->data[id]data[j] && st == 0 )
   248				{
   249					id = j;	
   250				}	
   251			}
   252			datatype temp = s->data[i];
   253			s->data[i] = s->data[id];
   254			s->data[id] = temp;
   255		}
   256	}
   257	//顺序表去重
   258	int delete_revalue(seq*s)
   259	{
   260		if (!s)
   261		{
   262			printf("创建表了吗?滚犊子!\n");
   263			return 0;
   264		}
   265		if (list_empty(s))
   266		{
   267			printf("表空!\n");
   268			return 0;
   269		}
   270		int i,j;
   271		for (i=0;ilen-1;i++)
   272		{
   273			for (j=i+1;jlen;j++)
   274			{
   275				if (s->data[i] == s->data[j])
   276				{
   277					delete_node(s,j+1);
   278					j=j-1;
   279				}
   280			}
   281		}
   282		return 1;
   283	}
   284	//扩容
   285	seq *expand(seq*s)
   286	{
   287		char flag;
   288		printf("是否扩容(y/n):");
   289		scanf("%c",&flag);
   290		if (flag == 'y' || flag == 'Y')
   291		{
   292			seq *p = realloc(s,sizeof(seq)+sizeof(s->data));
   293			if (p==NULL)
   294			{
   295				printf("扩容失败!");
   296				return NULL;
   297			}
   298			return p;
   299		}
   300	}
   301	//求最值
   302	datatype list_mvalue(seq*s,int flag)
   303	{
   304		if (!s)
   305		{
   306			printf("创建表了吗?滚犊子!\n");
   307			return 0;
   308		}
   309		if (list_empty(s))
   310		{
   311			printf("表空!\n");
   312			return 0;
   313		}
   314		datatype num=s->data[0];
   315		for (int j=1;jlen;j++)
   316		{
   317			if (num < s->data[j] && flag == 1 || num > s->data[j] && flag == 0)
   318				num = s->data[j];
   319		}
   320		if (flag == 1)
   321			printf("max:%d\n",num);
   322		else 
   323			printf("min:%d\n",num);
   324	}
   325	//顺序表反转
   326	int list_revers(seq *s)
   327	{
   328		if (!s)
   329		{
   330			printf("创建表了吗?滚犊子!\n");
   331			return 0;
   332		}
   333		if (list_empty(s))
   334		{
   335			printf("表空!\n");
   336			return 0;
   337		}
   338		int l=0,r=s->len-1;
   339		while(ldata[l];
   342			s->data[l] = s->data[r];
   343			s->data[r] = temp;
   344			l++;
   345			r--;
   346		}
   347	}
   348	//释放顺序表
     1	#include"static_seq.h"
     2	
     3	int main(int argc, const char *argv[])
     4	{
     5		seq * s = create_seq();
     6	#if 0
     7		add_list(s,8);
     8		add_list(s,4);
     9		add_list(s,2);
    10		add_list(s,9);
    11		add_list(s,7);
    12		int i;
    13		for (i=0;i<3;i++)
    14		{
    15			add_list(s,10);
    16		}
    17		add_list(s,11);
    18		delete_revalue(s);
    19		output_list(s);
    20		insert_node(s,1,3);
    21		output_list(s);
    22		delete_node(s,1);
    23		output_list(s);
    24		pos_change_node(s,1,3);
    25		output_list(s);
    26		values_change(s,8,4);
    27		output_list(s);
    28		query_value(s,3);
    29		list_search_value(s,8);
    30		list_sort(s,0);
    31		list_mvalue(s,0);
    32		output_list(s);
    33		list_revers(s);
    34		output_list(s);
    35	#endif
    36	#if 1
    37		printf("%ld %ld\n",sizeof(seq),sizeof(s->data));
    38		int i;
    39		for (i=0;i<40;i++)
    40		{
    41			add_list(s,7);
    42		}
    43		s = expand(s);
    44		s->data[41]=3;
    45		s->data[42]=45;
    46		printf("%d\n",s->data[42]);
    47		printf("%ld %ld\n",sizeof(seq),sizeof(s->data));
    48		
    49	#endif
    50		return 0;
    51	}

 

7、static在C语言中的用法

Static,顾名思义是静态、静止的意思,个人理解的含义是私有、静态。

私有就是隐藏。

  • static函数只能声明后的本文中调用

  • static全局变量只能声明后的本文中调用

  • static局部变量只能声明后的本函数调用

静态就是一直存在,相对于每次调用动态分配而言。

  • static函数(未验证是否每次调用代码地址都是一致的)

  • static全局变量生命周期到程序或进程结束;

  • static局部变量生命周期到程序或进程结束。

8、const在C语言中的用法

1、const只读变量

  • ==const==修饰的变量是只读的,本质还是变量

  • ==const==修饰的局部变量在栈上分配空间

  • ==const==修饰的全局变量在全局数据区分配空间

  • ==const==只在编译期有用,在运行期无用

1.1 const的本质

  • C语言中的==const==使得变量具有只读属性

  • 现代C编译器中的==const==将具有全局生命周期的变量存储于只读存储区

  • ==const==不能定义真正意义上的常量

1.2 const修饰函数参数和返回值

  • ==const==修饰函数参数表示在函数体内不喜欢改变参数的值

  • ==const==修饰函数返回值表示返回值不可改变,多用于返回指针的情形

  • C语言中的字符串字面量存储于只读存储区中,在程序中需要使用==const char*==指针

1.3 现代C编译器中的const

==const==全局变量:只读,值不可改变

==const==局部变量:

  • ==const==局部变量:只读,值不可改变

  • 普通局部变量:只读,值可改变

9、结构体中字节对齐原值

  • C语言中的==struct==可以看作变量的集合

  • C语言中的结构体,不能封装函数

  • 一般而言,结构体的大小是各个成员变量所占内存之和

  • 特殊而言,结构体需要进行字节对齐,有利于数据偏移,和寻址功能

  • 字节对齐内容

    • 在结构体中的每个属性会根据自己所占内存大小,来设置起始存储位置,起始存储位置,必须是自身类型的整数倍

    • 在上面对齐的基础上,最后整体会进行一次对齐,整体的字节个数要是一个数据的整数倍,这个数据是系统字节对齐和结构体中最大成员所占字节的之间取最小值。(系统对齐字节数,结构体中所占内存最大字节数)

10、数据结构的逻辑结构有哪些

  • 逻辑结构:表示数据元素之间的关联情况,根据元素间的关联情况,分为以下四种

    1. 集合结构:任意两个数据元素之间没用任何关系,只是单纯存储在同一个同一个集合中

    2. 线性结构:数据元素之间存在一对一的关系,在该结构中,除了第一个元素没有前驱,最后一个元素没有后继,其余所有数据都有且只有一个前驱和一个后继

    3. 树形结构:数据元素之间存在一对多的关系

    4. 图形结构:数据元素之间存在多对多的关系

11、数据结构的存储结构是什么,分别有哪些

  • 存储结构:数据的逻辑结构在计算机中的映射存储

  1. 顺序存储:将逻辑上连续的数据元素,存储在物理内存也连续的空间内

  2. 链式存储:将逻辑上相邻的数据元素,存储在物理内存上随机位置

  3. 索引存储:在存储数据元素时,单独创建一个索引表记录数据元素所在位置

  4. 散列存储:也叫哈希存储,将数据元素存储的位置跟数据元素的关键字有关

12、带参宏与函数的区别

  • 宏表达式被预处理器处理,编译器不知道宏表达式的存在

  • 宏表达式用 “实参” 完全替代形参,不进行任何运算

  • 宏表达式没有任何 “调用” 开销

  • 宏表达式中不能出现递归定义

13、宏定义与typedef的区别

  • 执行时间不一样,预处理只执行简单的替换

  • 宏定义不能连续定义指针类型,typedef可以

你可能感兴趣的:(数据结构,数据结构)