数据结构之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 --;
}

 

posted on 2018-03-16 20:08  肀肀  阅读(346)  评论(0编辑  收藏  举报

导航