• 线性表之顺序存储-顺序表


    顺序表的操作

    • [x] 向有序顺序表插入一个元素
    • [x] 顺序表的冒泡排序
    • [x] 顺序表的删除操作
    • [x] 顺序表中元素的查找
    • [x] 顺序表的逆置
    • [x] 删除顺序表中的相同元素
    • [x] 向顺序表的指定位置插入元素
    • [x] 打印顺序表

    顺序表的存储结构

    #define maxsize 100        //存储空间的分配量 
    
    //定义顺序表数据类型 
    typedef struct{
    	int data[maxsize];
    	int last;              //存放表中最后一个元素的下标 
    }sequenlist;
    

    顺序表的冒泡排序

    void list_bubble_sort(sequenlist *p)//max to min
    {
        int i,j;
        int temp;
    	for(i=0; i< p->last; i++)//attention
    	{
    		for(j=0; j< p->last-i; j++)
    		{
    		    if(p->data[j] < p->data[j+1])
    	        {
    	            temp = p->data[j];
    				p->data[j] = p->data[j+1];
    				p->data[j+1] = temp;	
    			}
    	    }
    	}	
    }
    

    顺序表的删除操作

    nt delete_1(sequenlist *s,int del) //删除函数 
    {
    	int temp;
    	for(int i=0; i <= s->last; i++)
    	{
    		if(del == s->data[i])
    		{
    			temp = i;
    			for(int j=i; j<s->last; j++)
    			{
    				s->data[j] = s->data[j+1];
    			}
    			s->last = s->last - 1;
    			return 0;//删除第一个与del相同的元素,函数结束 
    		}
    	}
    	//要删的那个元素不在表中 
    	printf("the element you want to delete is not in the sequenlist!
    "); 
    }
    

    顺序表中元素的查找

    int search(sequenlist *s,int key)    //查找函数 
    {
        for(int i=0; i<= s->last; i++)
        {
        	if(key == s->data[i])
        	{
        		printf("exist !
    ");
        		return 0;
    		}
    	}
    	printf("not found !
    ");
    	return 0;
    }
    

    顺序表的逆置

    void reverse(sequenlist *s)//逆置函数 
    {
        int i,j;
        int temp;
        int last_temp = s->last;
    	for(i=0; i<= s->last/2; i++)
    	{
    		temp = s->data[i];
            s->data[i] = s->data[last_temp];
    		s->data[last_temp] = temp;        
    	    last_temp--;
    	}
    }
    

    删除顺序表中的相同元素

    void delete_same(sequenlist *s)//删除表中相同的元素 
    {
    	int i,j;
    	int temp;
    	for(i=0; i<=s->last; i++)
    	{ 
    		for(j=1; j<=s->last; j++)
    		{
    			if(s->data[j] == s->data[i])//元素相同 
    			{
    			    for(int k=j; k<s->last; k++)
    				{
    					s->data[k] = s->data[k+1];
    				}
    				s->last = s->last - 1; 
    			}
    		}	
    	}
    }
    

    向顺序表的指定位置插入元素

    int insert(sequenlist *L,int i,int x) //指定位置,插入 
    {
    	int j;
    	if(((*L).last) >= maxsize-1)
    	{
    		printf("the list is overflow!
    ");
    		return (0);
    	}
    	else
    	{
    		if((i<1)||(i>(*L).last+2))
    		{
    			printf("position is not correct!
    ");
    			return (0);
    		}
    		else
    		{
    			for(j=(*L).last;j>=i-1;j--)
    			{
    				(*L).data[j+1]=(*L).data[j];				 
    			}
    			(*L).last=(*L).last+1;              
    			(*L).data[i-1]=x;
    			return (0);
    		}
    	}
    }
    

    向顺序表的指定位置插入元素

    int insert(sequenlist *L,int i,int x) //指定位置,插入 
    {
    	int j;
    	if(((*L).last) >= maxsize-1)
    	{
    		printf("the list is overflow!
    ");
    		return (0);
    	}
    	else
    	{
    		if((i<1)||(i>(*L).last+2))
    		{
    			printf("position is not correct!
    ");
    			return (0);
    		}
    		else
    		{
    			for(j=(*L).last;j>=i-1;j--)
    			{
    				(*L).data[j+1]=(*L).data[j];				 
    			}
    			(*L).last=(*L).last+1;              
    			(*L).data[i-1]=x;
    			return (0);
    		}
    	}
    }
    

    打印顺序表

    void print_list(sequenlist *s)   //打印顺序表 
    {
    	int i;
    	for(i=0; i<=s->last; i++)
    	{
    		printf("%3d",s->data[i]);
    	} 
    }
    

    试着煲下汤

    /*
    * author: shansan.top
    * date: 2018/12/12
    * version: 1.0 
    */
    
    #include<stdio.h>
    #define maxsize 100
    
    //定义顺序表数据类型 
    typedef struct{
    	int data[maxsize];
    	int last;
    }sequenlist;
    
    int search(sequenlist *s,int key)    //查找函数 
    {
        for(int i=0; i<= s->last; i++)
        {
        	if(key == s->data[i])
        	{
        		printf("exist !
    ");
        		return 0;
    		}
    	}
    	printf("not found !
    ");
    	return 0;
    }
    
    int delete_1(sequenlist *s,int del) //删除函数 
    {
    	int temp;
    	for(int i=0; i <= s->last; i++)
    	{
    		if(del == s->data[i])
    		{
    			temp = i;
    			for(int j=i; j<s->last; j++)
    			{
    				s->data[j] = s->data[j+1];
    			}
    			s->last = s->last - 1;
    			return 0;//删除第一个与del相同的元素,函数结束  
    		}
    	}
    	//要删的那个元素不在表中 
    	printf("the element you want to delete is not in the sequenlist!
    "); 
    }
     
    void print_list(sequenlist *s)   //打印顺序表 
    {
    	int i;
    	for(i=0; i<=s->last; i++)
    	{
    		printf("%3d",s->data[i]);
    	} 
    }
    
    void reverse(sequenlist *s)//逆置函数 
    {
        int i,j;
        int temp;
        int last_temp = s->last;
    	for(i=0; i<= s->last/2; i++)
    	{
    		temp = s->data[i];
            s->data[i] = s->data[last_temp];
    		s->data[last_temp] = temp;        
    	    last_temp--;
    	}
    }
    
    void list_bubble_sort(sequenlist *p)//max to min
    {
        int i,j;
        int temp;
    	for(i=0; i< p->last; i++)//attention
    	{
    		for(j=0; j< p->last-i; j++)
    		{
    		    if(p->data[j] < p->data[j+1])
    	        {
    	            temp = p->data[j];
    				p->data[j] = p->data[j+1];
    				p->data[j+1] = temp;	
    			}
    	    }
    	}	
    }
    
    void insert_in_order_list(sequenlist *s,int value)//有序表中插入元素 
    {
    	int i,j;
    	int count=0;
    	//int temp = s->last+1;
    	for(i=0; i<=s->last; i++)
    	{
    		count++;
    		if( value <= s->data[i])
    		{
    			s->last = s->last + 1;
    			for(j=s->last; j>i; j--)
    			{
    				s->data[j] = s->data[j-1];
    			}
    			s->data[i] = value;
    			return ;//结束函数 
    		}
    	}
    	//printf("i=%d",i);
    	//printf("s->last=%d
    ",s->last);
    	if(i > s->last-1)
    	{
    		s->last = s->last + 1;
    		s->data[s->last] = value;
    	}
    }
    
    int insert(sequenlist *L,int i,int x) //指定位置,插入 
    {
    	int j;
    	if(((*L).last) >= maxsize-1)
    	{
    		printf("the list is overflow!
    ");
    		return (0);
    	}
    	else
    	{
    		if((i<1)||(i>(*L).last+2))
    		{
    			printf("position is not correct!
    ");
    			return (0);
    		}
    		else
    		{
    			for(j=(*L).last;j>=i-1;j--)
    			{
    				(*L).data[j+1]=(*L).data[j];				 
    			}
    			(*L).last=(*L).last+1;              
    			(*L).data[i-1]=x;
    			return (0);
    		}
    	}
    }
    
    void delete_same(sequenlist *s)//删除表中相同的元素 
    {
    	int i,j;
    	int temp;
    	for(i=0; i<=s->last; i++)
    	{ 
    		for(j=1; j<=s->last; j++)
    		{
    			if(s->data[j] == s->data[i])//元素相同 
    			{
    			    for(int k=j; k<s->last; k++)
    				{
    					s->data[k] = s->data[k+1];
    				}
    				s->last = s->last - 1; 
    			}
    		}	
    	}
    }
    
    int main()
    {
    	sequenlist p={{1,3,2,6,5,4,9,7,8},8};
    	//这里有9个数,但数组下表是从0开始的,所以 p.last = 8 
    	print_list(&p);
    	printf("
    ");
    	
    	//查找
    	
    	printf("please input a value which you want: ");
    	int value;//C++语法可以临时定义一个变量,C语言不可以(需放在开头)。 
    	scanf("%d",&value); 
    	//search(&p,10);
    	search(&p,value);
    	print_list(&p);
    	printf("
    
    ");
    	
    	//删除表中的指定元素 
    	delete_1(&p,8);
    	printf("after delete:
    "); 
    	print_list(&p);
    	
    	
    	//逆置顺序表 
    	printf("
    
    after reverse:
    ");
    	reverse(&p);
    	print_list(&p);
    	
    	//冒泡排序 
    	printf("
    after sort:
    ");
    	printf("
    ");
    	
    	//list_bubble_sort(&try_1);
    	list_bubble_sort(&p);
    	print_list(&p); 
    	
    	
    	//往有序顺序表中插入一个元素
    	printf("
    
    ");
        sequenlist try_1 = {{1,2,3,5,6,7},5};
        print_list(&try_1);
    	
    	printf("
    ");
    	printf("please input the value that you wan to insert into the sequenlist: ");
    	int data;
    	scanf("%d",&data);
    	insert_in_order_list(&try_1,data);
    	//insert_in_order_list(&try_1,9);
    	print_list(&try_1);
    	
    	//删除表中相同的元素
    	printf("
    
    ");
    	sequenlist try_2= {{1,1,2,2,3,3,4,4},7};
    	print_list(&try_2);
    	printf("
    delete the same element:
    ");
    	delete_same(&try_2);
    	print_list(&try_2);
    	printf("
    ");
    	
    	
    	//另一种玩法
    	int n;
    	int i;
    	printf("
    please input the number of elements: ");
    	scanf("%d",&n);
    	printf("please input %d values:
    ",n); 
    	sequenlist try_3;
    	try_3.last = n-1;//注意,数组的小标从0开始 
    	for(i=0; i<=try_3.last; i++)
    	{
    		scanf("%d",&try_3.data[i]);
    	}
    	print_list(&try_3);
    	printf("
    
    ");
    	
    	//在指定位置插入 
    	insert(&try_3,1,22);
    	print_list(&try_3);
    	  
        return 0;	
    }
    

    程序运行结果

  • 相关阅读:
    php iconv函数转换出错问题
    linux 上配置swoole
    Linux中查看某 个软件的安装路径
    mysql 5.0存储过程学习总结
    maven--私服的搭建(Nexus的使用)
    Linux的chattr与lsattr命令详解
    [转]Delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法
    [转]Delphi 中动态链接库(dll)的建立和使用
    Delphi PChar与String互转
    [转]Delphi 快捷键 让你更像高手!!
  • 原文地址:https://www.cnblogs.com/sikongji-yeshan/p/10121654.html
Copyright © 2020-2023  润新知