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