数据结构之c++感悟
#include<iostream.h> 头文件;
#include<iostream.h> #define MAX 1024 typedef int Elemtype; typedef struct { int *elem; int length; }Sqlist; void Initlist(Sqlist &L) { L.elem=new int[MAX]; if(L.elem==NULL) return; else L.length=0; } void createlist(Sqlist &L) { cin>>L.length; for(int i=0;i<L.length;i++) cin>>L.elem[i]; } void printlist(Sqlist L) { for(int i=0;i<L.length;i++) cout<<L.elem[i]<<'\t'; } int emptylist(Sqlist L) { if(L.length==0) return 0; else return 1; } int queryelem(Sqlist L,Elemtype e) { for(int i=0;i<L.length;i++) if(L.elem[i]==e) return i+1; return 0; } void getelem(Sqlist L,int i,int &e) { if(i<1 || i>L.length) return; else e=L.elem[i-1]; } void insertelem(Sqlist &L,int i,int e) { if(i<1 || i>L.length+1) return; else for(int k=L.length-1;k>i-1;k--) L.elem[k+1]=L.elem[k]; L.elem[i-1]=e; L.length ++; } void main() { Sqlist L; Initlist(L); createlist(L); printlist(L); int null; null=emptylist(L); if(null==0) cout<<"it is nulllist"; else cout<<" \nit is not nulllist"; int e; cout<<"\nput on query elem"; cin>>e; int i; i=queryelem(L,e); if(i!=0) cout<<i; cout<<"\n put on di ji ge elem"; cin>>i; getelem(L,i,e); cout<<e; cout<<"put on insert elem and locate"; cin>>i>>e; insertelem(L,i,e); printlist(L); }
#define MAX 1024 宏定义
typedef int Elemtype; typedef (取一个别名), int的别名就是Elemtype。
typedef struct 定义一个结构体,这个结构体的名字叫做SqList;这个SqList的结构体中有整型的*elem,整型的length
{
Elemtype *elem;
int length;
}SqList;
void InitList(SqList &L) 初始化函数来初始我定义的SqList &L这个结构体的变量,注意加&是改变L这个结构体变量的数据。
{
L.elem=new Elemtype[MAX]; 通过new函数 申请一个整型的数组,将这个数组赋予给L.elem这个指针,L.elem是调用这个elem这个整型指针。
if(L.elem==NULL) 如果这个空间为空的话,则不带返回值的return语句只能用于返回类型为void的函数,return语句是为了引起函数的强制结束,
这种用法类似于循环结构中的break语句的作用。new函数申请整型数组赋予结构体当中的指针。为什么要赋予给指针,因为
在c++中,数组其实指针来解释的。
return ; 判断开辟空间成功还是失败,失败是NULL,直接退出。成功为0
else
L.length=0; 否则就是有空间,但是这个空间还没有数据,所以他的长度为0. 有空间就相当于开辟了一个长方形。
}
void creat_list(SqList &L) 创建一个有数据的线性表的函数。
{
cin>>L.length; 输入这个线性表的长度,例如你输入5,代表在这个长方形中划4条竖线,不就有5个格子呢。5个格子还没有数据对不对啊?
for(int i=0;i<L.length;i++) 所以我们就需要用for循环来为这5个格子填写你想要的数据,不就行了。for循环输入每个具体的数据
cin>>L.elem[i]; 电脑出现让你输5次。你就输呗。
}
void print(SqList L) 创建一个打印函数。结构体Sqlist定义的L为什么没有像以前那样加&号,是因为打印函数根本没有改变L的数据啊
{
for(int i=0;i<L.length;i++) 打印不就循环小于你输入这个线性表的长度。 直接用for循环遍历即可打印。
cout<<L.elem[i]<<'\t'; 输出你打印的就行了。 打印好看点,打印的就不会挤在一起呢。\t相当于tab制表符的缩写,跳过四个空格;
}
int IsEmpty(SqList L) 判断这个线性表是否为空的话,
{
if(L.length==0) 如果是1的话就为真。 其实就是判断线性表的长度是否为0;
return 1;
else
return 0; 否则就为假呗。
}
void Getelem(SqList L,int i,Elemtype &e) 获取L中的第i个元素。第i个元素是就信息世界而言的,是对人类好理解的,对程序而言的话。第i个元素的是
第i-1个元素。知道获取的范围;
{
if(i<1||i>L.length) ***难一下,获取的不在这个线性表的长度范围之内。
return;
else
e=L.elem[i-1]; 如果在的话,就把这个第i个元素的值赋给e呗。 线性表中的第几个元素对应的值都是固定的,因此根本就不必要想遍历。
}
int Locatelem(SqList L,Elemtype e) 这个函数就是判断这个线性表中的数据e是在第几个位置。Locatelem就是干这活的。
{
for(int i=0;i<L.length;i++)//n 首先遍历我这个线性表L中的所有数据,遍历最好用的当然是for循环呢。遍历这个线性表只要小于这个线性表的
长度即可 查询一个元素的位置当然第一步就是遍历所有的元素,看是否有符合条件的,
if(L.elem[i]==e) //n T(n)=O(n) T(n)=O(1) 遍历一个,判断一个,看他是否是在第e个位置。
return i+1; 是的话,放回一个i+1,为什么是i+1呢,因为对程序而言,他想的第一个是第从0开始,而我们人类想的第一个
是从第1开始的,所以这个变成了i+1,而不是i呢。
return 0; 如果全部遍历完了之后,都没有找到数据e,就返回0呢呗。
}
void InsertList(SqList &L,int i,Elemtype e) 这个一个插入函数,就是在第i个插入e这个元素。
{
if(i<1||i>L.length+1) ***难一下,就是如果i<1的话和i>这个长度加1的话,为什么这个长度要加1呢,因为大于线性表的长度是可以,如
线性表的长度是5,大于5,也就是第6个,在第6个插入元素e,是完全ok的啦。 判断插入的是否在这个范围?
cout<<"位置不合理\n";
else
if(L.length>=MAX) 相当于把这张纸开辟出的长方形已经占满呢,无法再开辟呢,说明就无法再插入呢,所以表就已满呢
cout<<"表已满\n";
else
{
for(int j=L.length-1;j>=i-1;j--) 首先我肯定是遍历后三个手指,也就是第i之后的元素。 插入肯定要遍历呢。遍历后向后挪一位。空的位置赋予新值
L.elem[j+1]=L.elem[j]; 然后把三个手指往后挪一位就可以。就在第i处空出一个位置呢。 表自增。
L.elem[i-1]=e; 然后把空出的位置给e即可
L.length++; 在把整个线性表的长度加1即可。
}
}
void main() 主函数的定义
{
SqList L; 结构体sqlist定义一个名为L的线性表。
InitList(L); 通过初始化函数初始这个线性表。就是给这个线性表开辟一个空间,相当于给一张纸开辟出一个长方形。
creat_list(L); 创建一个有数据的线性表,相当于给这张纸画4条竖线。
print(L); 打印这个线性表
int len;
len=IsEmpty(L);
if(len==1)
cout<<"空表";
else
{
cout<<"非空";
}
int i;
cout<<"\n请输入查找的位置:";
cin>>i;
Elemtype e;
Getelem(L,i,e); 获取线性表中第i个元素,并将第i个元素的值赋予e
cout<<e<<endl;
cout<<"\n请输入查找的元素的值:";
cin>>e;
i=Locatelem(L,e); 查找线性表中e这个元素是在线性表中排第几个。
if(i!=0)
cout<<i<<endl;
cout<<"\n请输入插入的位置和元素的值:";
cin>>i>>e;
InsertList(L,i, e); 在线性表L中的第i处插入名为e的元素。
print(L);
}
数据结构默写代码:
1 #include<iostream.h> 2 #define MAX 1024 3 typedef int Elemtype; 4 typedef struct 5 { 6 Elemtype *elem; 7 int length; 8 }Sqlist; 9 10 void Initlist(Sqlist &L) 11 { 12 L.elem=new Elemtype[MAX]; 13 if(L.elem==NULL) 14 return; 15 else 16 L.length=0; 17 } 18 19 void createlist(Sqlist &L) 20 { 21 cin>>L.length; 22 for(int i=0;i<L.length;i++) 23 cin>>L.elem[i]; 24 } 25 26 void printlist(Sqlist L) 27 { 28 for(int i=0;i<L.length;i++) 29 cout<<L.elem[i]<<'\t'; 30 } 31 32 int emptylist(Sqlist L) 33 { 34 if(L.length==0) 35 return 1; 36 else 37 return 0; 38 } 39 40 void getelem(Sqlist L,int i,int &e) 41 { 42 if(i<1||i>L.length) 43 return; 44 else 45 e=L.elem[i-1]; 46 } 47 48 void insertelem(Sqlist &L,int i,int e) 49 { 50 if(i<1 || i>L.length+1) 51 return; 52 else 53 for(int k=L.length-1;k>=i-1;k--) 为什么k=L.length-1呢,因为他想第5个手指,对程序而言,其实就是4,0是第一个。把4往后挪一位,变成5。 54 L.elem[k+1]=L.elem[k]; 55 L.elem[i-1]=e; 56 L.length ++; 57 } 58 59 int locateelem(Sqlist L,int e) 60 { 61 for(int i=0;i<L.length;i++) 62 if(L.elem[i]==e) 63 return i+1; 64 return 0; 65 } 66 void main() 67 { 68 Sqlist L; 69 Initlist(L); 70 createlist(L); 71 printlist(L); 72 int null; 73 null=emptylist(L); 74 if(null==1) 75 cout<<"it is nulllist"; 76 else 77 cout<<"it is not nulllist"<<"\n"; 78 int i; 79 cout<<"put on locate"<<'\t'; 80 cin>>i; 81 int e; 82 getelem(L,i,e); 83 cout<<e; 84 cout<<"\nput on your insert elem locate and elem value"; 85 cin>>i>>e; 86 insertelem(L,i,e); 87 printlist(L); 88 cout<<"\nput on your query elem"; 89 cin>>e; 90 i=locateelem(L,e); 91 if(i!=0) 92 cout<<i<<endl; 93 94 }
void deleteelem(Sqlist &L,int i)
{
if(i<1 || i>L.length+1)
return;
else
for(int k=i;k<=L.length-1;k++)
L.elem[k-1]=L.elem[k];
L.length --;
}