數組實現順序表


1. 順序存儲結構:把數據元素放在 地址連續的存儲單元里

 

 

 

定義一個結構放順序存儲的內容

typedef struct seqlist{
  int data[10]; //順序表中的實際內容
  int last; // 順序表中的數據元素,從 0 開始
}seqlist,*Seqlist;  // 順序表類型
//重新定義一個指針類型 這只是聲明了一個類型, 並沒有實際的變量,也沒有申請空間

2. 順序表的操作

1. 建空表,

2. 插入元素,

3.刪除元素,

4. 按位置查找元素,

5. 按照元素查找位置,

6. 去除表中重復元素,

7. 求表長度 ( 表中實際元素個數 ) ,

8. 修改表中元素值,合並2個順序表,

9. 銷毀順序表

 

    

 

 3. 源碼:一級指針建表方式實現

seqlist.c文件

/*
一級指針建表
*/
#include "seqlist.h"

//創建一個空的順序表
Seqlist *creat_seqlist(void)
{
    Seqlist *list = NULL;//初始化為空
    list = (Seqlist*)malloc(sizeof(Seqlist));//堆中申請一個空間存放表
    //    list = (Seqlist*)malloc(-1); //失敗,
    //     malloc函數沒執行情況,list沒有初始化,指向的是野指針
    if(NULL == list) //區分malloc的NULL與初始化的NULL
    {
        printf("\tmalloc error\n");
        return NULL;
    }
    list->last = -1; //建表清空
    return list;
}

//清空表
void clear_seqlist(Seqlist *list)
{
    if(list ==NULL)//判斷傳入的值是否有效
    {
        printf("\tlist is NULL\n");
        return ;
    }
    list->last = -1;
}

//判斷表是否為空,1為空,  0為非空
int is_empty_seqlist(Seqlist *list)
{
    if(NULL == list)
    {
        printf("\tlist is NULL\n");
        return -1;
    }
    return ((list->last==-1)?1:0) ;
}

//判斷滿 , 1 滿 ;0不滿   -1 表空
int is_full_seqlist(Seqlist *list)
{
    if(NULL == list)
    {
        printf("\tlist is NULL\n");
        return -1;
    }
    return ((list->last==(MAXSIZE-1))?1:0);
}

//插入數據 -1 失敗   1成功
int inster_seqlist(Seqlist *list, int pos ,int value)
{
    if(NULL == list)
    {
        printf("\tinster list is null\n");
        return -1;
    }
    if(is_full_seqlist(list) == 1)//表滿
    {
        printf("\tinster list is full\n");
        return -1;
    }
    if(pos<0 || pos > list->last+1)//插入位置無效
    {
        printf("\tinster pos is error\n");
        return -1;
    }

    int i=0;
    //把插入的pos位置到末尾這區域的值集體向后移動
    //就是下標pos至list->last集體后移一位
    for(i=list->last;i>=pos;i--)
    {
        list->data[i+1] = list->data[i];
    }

    list->data[pos] = value;
    list->last++;
    return 1;
}

//遍歷顯示順序表中的內容,以last為准
void show_seqlist(Seqlist *list)
{
    if(NULL == list)
    {
        printf("\tshow list is null\n");
        return ;
    }
    if(is_empty_seqlist(list)==1)
    {
        printf("\tshow list is empty\n");
        return ;
    }
    int i=0;
    for(i=0;i<=list->last;i++)
    {
        printf("\t%d\n",list->data[i]);
    }
}

//刪除表中一個元素    1成功   -1失敗
//參數:要操作的表list,要刪除的位置pos, 刪除的內容放在value中
int del_seqlist(Seqlist *list, int pos, int *value)
{
    if(NULL == list)
    {
        printf("\tdelete list is null\n");
        return -1;
    }
    if(is_empty_seqlist(list) == 1) //傳的list是否為空
    {
        printf("\tdel_seqlist list is null\n");
        return -1;
    }

    if(pos<0 || pos>list->last)//傳入的位置合理,刪除元素,元素下標 0~list->last
    {
        printf("\tpos is error\n");
        return -1;
    }
    *value = list->data[pos];//取出要刪除位置的數據
    int i=0;
    //需要移動的數據下標范圍,pos+1 ~ last
    //要刪除的位置pos,要移動數據的位置pos+1~last
    //pos在最后一個位置時,循環條件不滿足,直接不執行移位
    //    for(i=pos+1;i<=list->last;i++)
    //    {
    //        list->data[i-1] = list->data[i];
    //    }
    for(i=pos;i<list->last;i++)
    {
        list->data[i] = list->data[i+1];
    }
    list->last--;
    return 1;
}

//求表長,表中實際的元素個數
int length_seqlist(Seqlist *list)
{
    if(NULL == list)
    {
        printf("\tlength list is null\n");
        return -1;
    }
    if(is_empty_seqlist(list)==1)//表空 0 個元素
    {
        return 0;
    }
    return  (list->last+1);
}

//獲取數據
int getdata_seqlist(Seqlist *list, int pos)
{

    if(NULL == list)
    {
        printf("\tgetdata list is null\n");
        return -1;
    }
    if(is_empty_seqlist(list)==1)
    {
        printf("\tgetdata list is empty\n");
        return -1;
    }
    if(pos<0 || pos>list->last)
    {
        printf("\tgetdata pos is error\n");
        return -1;
    }
    return list->data[pos];
}


//第一次出現的位置
//給元素獲取位置
int getpos_seqlist(Seqlist *list, int data)
{
    if(NULL == list)
    {
        printf("\tgetpos list is null\n");
        return -1;
    }
    if(is_empty_seqlist(list)==1)
    {
        printf("\tgetpos list is empty\n");
        return -1;
    }
    int i=0;
    for(i=0;i<=list->last;i++)
    {
        if(data == list->data[i])
        {
            return i;
        }
    }
    return -1;
#if 0
    int tip=-1; 
    for(i=0;i<=list->last;i++)
    {
        if(list->data[i]==data)
        {
            tip=i;
            break;
        }
    }
    return tip;
#endif
}

/*銷毀表時需要,傳遞需要銷毀表的地址,類似於使用函數交換數據
 * 傳值是不能修改數據內容的,需要傳遞地址,才可以修改數據內容,
 *此處也就是傳遞的二級指針
 * */
 //銷毀表
void free_seqlist(Seqlist **list)
{
    if(list == NULL || *list == NULL)
    {
        printf("\tlist is null\n");
    }

    free(*list);
    *list=NULL;
}
//修改表中的某個值
int change_seqlist(Seqlist *list, int pos, int value)
{
    if(list == NULL){ printf("change list is null\n");return -1; }
    if(pos<0 || pos>list->last)//pos位置不合理
    {
        printf("change list pos is error\n");
        return -1;
    }
    list->data[pos] = value;//改值
    return 1;
}
//刪除表中重復的內容
int del_repeat_seqlist(Seqlist *list)
{
    int a;
    if(list == NULL){ printf("del repeat list is null\n");return -1; }
    int i,j;
    for(i=0;i<length_seqlist(list);i++)//在刪除元素時,表的長度是變化的
    {
        for(j=i+1;j<length_seqlist(list);j++)//查看表的長度是,表中數據個數
        {
            if(list->data[i]==list->data[j])//找到兩個相等的元素
            {
                if(del_seqlist(list,j,&a) == -1) //刪除過程失敗
                {
                    printf("del_repeat_seqlist is error\n");
                    return -1;
                }
                j--;
                printf("repeat data %d\n",a);
            }
        }
    }
    return 1;
}



int merge_seqlist(Seqlist *list_a, Seqlist *list_b)//合並兩個表,重復的數據刪除
{
    if(list_a==NULL || list_b==NULL){ printf("merge list is null\n");return -1; }
    int i=0;
    //把表b中的數據,在表a中獲取位置,沒有位置,
    //說明沒有這個元素,獲取到位置說明存在這個元素,
    //把表b中這個元素刪除
    for(i=0;i<=list_b->last;i++)
    {
        if(getpos_seqlist(list_a,list_b->data[i]) == -1)//表a中,無表b中這個元素
        {
            if(inster_seqlist(list_a,0,list_b->data[i]) == -1)//在表a中,插入這個表b中的元素
            {
                printf("merge inster error\n");
                return -1;
            }
        }
    }
    return 1;
}

 

 

seqlist.h文件:

#ifndef __SEQLIST_H
#define __SEQLIST_H

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10

typedef struct list{
    int  data[MAXSIZE]; //存放表的內容
    int last; // 表的實際用的內容大小
}Seqlist;

Seqlist *creat_seqlist(void);//建一個空表
void clear_seqlist(Seqlist *list);//清空表
int is_empty_seqlist(Seqlist *list);//判斷表是否為空
int is_full_seqlist(Seqlist *list);//判斷表滿
int inster_seqlist(Seqlist *list, int pos, int value);//插入數據
void show_seqlist(Seqlist *list);//顯示內容
int del_seqlist(Seqlist *list, int pos, int *value);//刪除表中一個元素
int length_seqlist(Seqlist *list);//求表長
int getdata_seqlist(Seqlist *list, int pos);//獲取數據
int getpos_seqlist(Seqlist *list, int data);//給元素獲取位置
void free_seqlist(Seqlist **list);//銷毀表
int change_seqlist(Seqlist *list, int pos, int value);//修改表中的某個值
int del_repeat_seqlist(Seqlist *list);//刪除表中重復的內容
int merge_seqlist(Seqlist *list_a, Seqlist *list_b);//合並兩個表,重復的數據刪除

#endif

 

 測試main.c文件

#include <stdio.h>
#include "seqlist.h"

int main(int argc, const char *argv[])
{
    int i=0;
    //插入數據 表1
    printf("create s1 \n");
    Seqlist *s1=creat_seqlist();
    if(NULL == s1)//建表失敗
    {    printf("s1 create error\n");    return -1;    }
    for(i=0;i<4;i++)  inster_seqlist(s1,0,i);
    inster_seqlist(s1,0,1);
    printf("show s1 data\n");
    show_seqlist(s1);
    del_repeat_seqlist(s1);
    show_seqlist(s1);

    //操作表 2
    printf("create s2\n");
    Seqlist *s2=creat_seqlist();
    if(NULL == s2)//建表失敗
    {    printf("s1 create error\n");    return -1;    }
    for(i=0;i<4;i++)  inster_seqlist(s2,0,i+1);
    printf("show s2 data\n");
    show_seqlist(s2);
    printf("merge_seqlist\n");
    merge_seqlist(s1,s2);
    printf("\n\n show s1 \n");
    show_seqlist(s1);
    
//釋放內存
    free_seqlist(&s1);
    if(s1==NULL)    {    printf("\ts is null\n");  }
    free_seqlist(&s2);
    if(s2==NULL)    {    printf("\ts is null\n");  }

    return 0;
}

 

 

 

 結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM