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

顺序表的操作

  • [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!\n"); 
}

顺序表中元素的查找

int search(sequenlist *s,int key)    //查找函数 
{
    for(int i=0; i<= s->last; i++)
    {
        if(key == s->data[i])
        {
            printf("exist !\n");
            return 0;
        }
    }
    printf("not found !\n");
    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!\n");
        return (0);
    }
    else
    {
        if((i<1)||(i>(*L).last+2))
        {
            printf("position is not correct!\n");
            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!\n");
        return (0);
    }
    else
    {
        if((i<1)||(i>(*L).last+2))
        {
            printf("position is not correct!\n");
            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 !\n");
            return 0;
        }
    }
    printf("not found !\n");
    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!\n"); 
}
 
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\n",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!\n");
        return (0);
    }
    else
    {
        if((i<1)||(i>(*L).last+2))
        {
            printf("position is not correct!\n");
            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("\n");
    
    //查找
    
    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("\n\n");
    
    //删除表中的指定元素 
    delete_1(&p,8);
    printf("after delete:\n"); 
    print_list(&p);
    
    
    //逆置顺序表 
    printf("\n\nafter reverse:\n");
    reverse(&p);
    print_list(&p);
    
    //冒泡排序 
    printf("\nafter sort:\n");
    printf("\n");
    
    //list_bubble_sort(&try_1);
    list_bubble_sort(&p);
    print_list(&p); 
    
    
    //往有序顺序表中插入一个元素
    printf("\n\n");
    sequenlist try_1 = {{1,2,3,5,6,7},5};
    print_list(&try_1);
    
    printf("\n");
    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("\n\n");
    sequenlist try_2= {{1,1,2,2,3,3,4,4},7};
    print_list(&try_2);
    printf("\ndelete the same element:\n");
    delete_same(&try_2);
    print_list(&try_2);
    printf("\n");
    
    
    //另一种玩法
    int n;
    int i;
    printf("\nplease input the number of elements: ");
    scanf("%d",&n);
    printf("please input %d values:\n",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("\n\n");
    
    //在指定位置插入 
    insert(&try_3,1,22);
    print_list(&try_3);
      
    return 0;   
}

程序运行结果

image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容