顺序表 自我理解

5 篇文章 0 订阅

    顺序表的实现比较简单些,顺序表可以用数组模拟 ,如果使用数组进行模拟,会比采用指针更简单,但是老师建议用指针来写,适合初学者回忆程序基本语法。

typedef struct list{
	int data;
	int length;
	int *elem;	
}sqlist; 

这一段的 typedef 我想了好久的,因为在之前老师说这是一个定义性函数,但是连着一个结构函数我就有些晕了。。(哭唧唧)

typedef struct list 指的是 用 list 来代替 struct 即 struct node==list node。

顺序表需要三个元素:{1.存取数据 2.存取长度,3.存取指针}

void Initerlist(sqlist &l)
{
	l.elem=(int*)malloc(100*sizeof(int)); 
	l.length=0;
	l.data=0;
	int i;
	for(i=0;i<l.length+1;i++)
		l.elem[i]=0;
	printf("线顺表初始化完成! \n");
	return;
}

最开始的初表是l.length=100的,但是我也不知道我抽了什么风。。。(呜呜),在写这个时我又在改自己的bug(挠头呀)

好了初始化后

void inserlist(sqlist &l)
{
	
	int i,t;
	l.length+=1;        //每次运行时长度总会先进行加一操作。
	printf("请输入要插入的位置:\n");
	cin>>i;
	if(i<1||i>l.length)  //进行判断是否在表内。
	{
		printf("输入错误!\n");
		return;
	}
	
	printf("请输入要插入的数:\n");

	cin>>t;
	int j;
	for(j=l.length-1;j>i-1;j--)//插入时,先进行i位置后的每一元素位置后移一个单位。
	{
		l.elem[j]=l.elem[j-1];
	}
	
	l.elem[i]=t;       //输入插入元素.
	printf("%d",l.elem[i]);
	printf("插入完成!\n");
	return;
}

每一个表的最重要的地方就是表元素的插入与输出

插入问题有:1.如何进行相关位置操作而不影响之后的元素。   2. 如何对应其他的每一个元素应在的位置。

void coutlist(sqlist &l)
{
	int i;
	if(l.length==0)
	{
		printf("顺序表为空!\n");
	}
	if(l.length!=0)
	{
		
		for(i=1;i<=l.length;i++)
		{
			printf("%d ",l.elem[i]);
			
		}
	}
	return ;
}

 

表的输出先进行判断表是否为空,若不为空,则进行输出操作。

 

其他的操作就没什么写的了,注重就是了解顺序表的插入与输出基本就可以了

一下是自己理解并询问大佬纯手工代码。。(头好冷啊!!)

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
const int list_add=10;
const int list_size=100;
typedef struct list{
	int data;
	int length;
	int *elem;	
}sqlist; 

void Initerlist(sqlist &l)
{
	l.elem=(int*)malloc(100*sizeof(int)); 
	l.length=0;
	l.data=0;
	int i;
	for(i=0;i<l.length+1;i++)
		l.elem[i]=0;
	printf("线顺表初始化完成! \n");
	return;
}
void cleanlist(sqlist &l)
{
	l.length=0;
	printf("线顺表清空完成!\n");	
	return;
}
void getlengh(sqlist &l)
{
	
	int t=l.length;
	printf("该顺序表的长度为:%d \n",t);
	return;
}
void inserlist(sqlist &l)
{
	
	int i,t;
	l.length+=1;
	printf("请输入要插入的位置:\n");
	cin>>i;
	if(i<1||i>l.length)
	{
		printf("输入错误!\n");
		return;
	}
	
	printf("请输入要插入的数:\n");

	cin>>t;
	int j;
	for(j=l.length-1;j>i-1;j--)
	{
		l.elem[j]=l.elem[j-1];
	}
	
	l.elem[i]=t;
	printf("%d",l.elem[i]);
	printf("插入完成!\n");
	return;
}
void deletelist(sqlist &l)
{
	int i;
	printf("请输入要删除的位置:");
	cin>>i;
	if(i<1||i>l.length)
	{
		printf("输入错误!\n");
		return;
	}
	for(int j=i+1;j<=l.length;j++)
	{
		l.elem[j]=l.elem[j+1];
	}
		l.length--; 
		printf("删除完成!\n");	
		return; 
}
void prolist(sqlist &l)
{
	int i;
	printf("请输入位置:");
	cin>>i;
	if(i<2||i>l.length)
	{
		printf("输入错误!\n");
		return;
	}
	printf("该元素的前驱为:%d",l.elem[i-1]);
	return;
}
void nextlist(sqlist &l)
{
	int i;
	printf("请输入位置:");
	cin>>i;
	if(i<1||i>l.length)
	{
		printf("输入错误!\n");
		return;
	}
	printf("该元素的后驱为:%d",l.elem[i+1]);
	return;
}
void getelem(sqlist &l)
{
	int i;
	printf("请输入要显示的位置:");
	cin>>i;
	if(i<1||i>l.length)
	{
		printf("输入错误!\n");
		return;
	}
	printf("该位置的数为%d",l.elem[i]);
	return ; 
}
void coutlist(sqlist &l)
{
	int i;
	if(l.length==0)
	{
		printf("顺序表为空!\n");
	}
	if(l.length!=0)
	{
		
		for(i=1;i<=l.length;i++)
		{
			printf("%d ",l.elem[i]);
			
		}
	}
	return ;
}
void showlist()
{
    cout<<"0.初始化线性表"<<endl;
    cout<<"1.清空线性表"<<endl;
    cout<<"2.求线性表长度"<<endl;
    cout<<"3.获取线性表指定位置元素"<<endl;
    cout<<"4.求前驱"<<endl;
    cout<<"5.求后继"<<endl;
    cout<<"6.在线性表指定位置插入元素"<<endl;
    cout<<"7.删除线性表指定位置元素"<<endl;
    cout<<"8.显示线性表"<<endl;
    cout<<"输入负数退出"<<endl;
}
int main(int argc,const char *argv[])
{
	int c;
	sqlist l;
	
	while(1)
	{
		
		system("cls");
		
		showlist();
		cout<<"请输入操作数字:"<<endl;
		cin>>c;
		if(c<0)
		{
			printf("操作结束!\n");
			return 0; 
		}
		switch(c)
		{
			case 0:
				{
				Initerlist(l);
                 break;

				 }  
          case 1:{
          		cleanlist(l);
				break;
		 		 }
            case 2:{
				getlengh(l);
				break;
			}
                
            case 3:{
			   getelem(l); 
				break;
			}
            case 4:
             {
				prolist(l);
                break;
            }
			case 5:
            {
			    nextlist(l);
                break;
        	}
			case 6:
            {
			    inserlist(l);
                break;
            }
			case 7:
             {
			    deletelist(l);
            	break;
            }
			case 8:
        	{
				coutlist(l);
                break;
        	}
			case 9:
            {
			    return 0;
                break;
			}
		}
		getchar();
	getchar();
	}
	
	return 0;
 } 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值