1. 程式人生 > >c語言順序表的基本操作

c語言順序表的基本操作

下面是順序表的基本操作,c語言版的資料結構書上寫的操作都實現了

因為總體程式碼太長如果寫在一個class中要近500行,閱讀和修改都不方便,所以採用分開寫,希望大家以後寫較長的程式時也採用這種方法,自己執行的所有功能都能實現,而且個人感覺介面還是比較人性化的,大家還有什麼意見或者程式有什麼問題都可以在評論區提出,我會及時修改的。

seqlist.h

#ifndef SEQLIST_H
#define SEQLIST_H
#include <stdio.h>
#include <malloc.h>
#define SEQLISR_INIT_SIZE 5
#define INC_SIZE 3

typedef int ElemType;
typedef struct Seqlist
{
    ElemType *base;//指標域
    int capacity;//順序表容量
    int size;//表的大小
}Seqlist;

void create_list(Seqlist *list);//順序表元素的輸入
bool Inc(Seqlist *list);//增加順序表的容量
void InitSeqlist(Seqlist *list);//初始化順序表
void push_back(Seqlist *list,ElemType x);//在順序表的末尾插入元素
void push_front(Seqlist *list,ElemType x);//在順序表的頭部插入元素
void show_list(Seqlist *list);//顯示順序表的元素
void pop_back(Seqlist *list);//刪除順序表的最後一個元素
void pop_front(Seqlist *list);//刪除順序表的第一個元素
void insert_pos(Seqlist *list,int pos,ElemType x);//在順序表的指定位置插入資料
int find(Seqlist *list,ElemType key);//查詢元素key的下標
int length(Seqlist *list);//求順序表的長度
void delete_pos(Seqlist *list,int pos);//刪除順序表中指定位置的資料
void delete_val(Seqlist *list,int key);//刪除順序表中值為key的元素
void sort(Seqlist *list);//氣泡排序
void reverse(Seqlist *list);//逆置順序表
void clear(Seqlist *list);//清除順序表中的所有元素
void destroy(Seqlist *list);//摧毀順序表
void merge(Seqlist *lt,Seqlist *la,Seqlist *lb);//吧兩個表合為一個表



#endif // SEQLIST_H
seqlist.cpp

#include "seqlist.h"

void InitSeqlist(Seqlist *list)//初始化順序表,建立一個名字為List的線性表,list通過結構體定義
{
    list->base=(ElemType*)malloc(sizeof(ElemType)*SEQLISR_INIT_SIZE);//對錶list分配空間
    if(!list->base)
        exit(-1);
    list->capacity=SEQLISR_INIT_SIZE;//順序表的容量
    list->size=0;//順序表的大小/長度,表示當前順序表中無任何內容
}

bool Inc(Seqlist *list)//增加順序表的容量
{

    ElemType *newbase=(ElemType*)realloc(list,sizeof(ElemType)*(list->capacity+INC_SIZE));//重新分配記憶體空間,增減INC個容量
    if(newbase==NULL)
        printf("記憶體分配失敗!");

    list->base=newbase;
    list->capacity+=INC_SIZE;

}

void create_list(Seqlist *list)
{
    int i,x;
    printf("請確定輸入元素的個數:");
    scanf("%d",&i);
    printf("請輸入元素\n");

    for(int j=0; j<i; j++)
    {
        scanf("%d",&x);
        list->base[j]=x;
    }
    list->size=i;
}

void push_back(Seqlist *list,ElemType x)//在順序表的尾部插入元素
{
    if(list->size>=list->capacity&&!Inc(list))
    {
        printf("順序表已滿,無法在尾部插入新元素");
        return;
    }
    list->base[list->size]=x;
    list->size++;
}

void push_front(Seqlist *list,ElemType x)//在順序表頭部插入新元素
{
    if(list->size>=list->capacity&&!Inc(list))
    {
        printf("順序表已滿,無法在尾部插入新元素");
        return;
    }
    for(int i=list->size; i>0; i--)
    {
        list->base[i]=list->base[i-1];
    }
    list->base[0]=x;
    list->size++;
}

void show_list(Seqlist *list)//順序表的列印輸出
{
    for(int i=0; i<list->size; i++)
    {
        printf("%d\n",list->base[i]);
    }
}

void pop_front(Seqlist *list)//刪除表頭元素
{
    if(list->size==0)
    {
        printf("順序表為空,無法刪除元素");
        return;
    }
    for(int i=0; i<list->size-1; i++)
    {
        list->base[i]=list->base[i+1];
    }
    list->size--;
}

void pop_back(Seqlist *list)//刪除最後一個元素
{
    if(list->size==0)
    {
        printf("順序表為空,無法刪除元素");
        return;
    }
    list->size--;//這也太聰明瞭,直接減少一個元素
}

int length(Seqlist *list)
{
    return list->size;
}

void insert_pos(Seqlist *list,int pos,ElemType x)//在指定位置插入元素
{
    if(pos<0||pos>list->size)
    {
        printf("插入位置不合法,無法插入元素");
        return;
    }
    if(list)
        for(int i=list->size; i>pos; i--)
        {
            list->base[i]=list->base[i-1];
        }
    list->base[pos]=x;
    list->size++;
}

int find(Seqlist *list,ElemType key)//尋找key的位置
{
    for(int i=0; i<list->size; i++)
    {
        if(list->base[i]==key)
            return i;
    }
    return -1;
}

void delete_pos(Seqlist *list,int pos)//刪除指定位置的元素
{
    if(pos<0||pos>=list->size)
    {
        printf("刪除位置不合法");
        return;
    }
    for(int i=pos; i<list->size-1; i++)
    {
        list->base[i]=list->base[i+1];
    }
    list->base--;
}

void delete_val(Seqlist *list,int key)//刪除指定元素
{
    int pos=find(list,key);
    if(pos==-1)
    {
        printf("順序表中沒有這個元素");
        return;
    }
    delete_pos(list,pos);
}

void sort(Seqlist *list)
{
    for (int i = 0; i < list->size - 1; i++) //排序的趟數(例如5個數據需要比較4趟)
    {
        for (int j = 0; j < list->size - 1 - i; j++) //每一趟比較中的比較次數(例如5個數據在第0趟需要比較4次)
        {
            if (list->base[j] > list->base[j + 1])
            {
                ElemType temp = list->base[j];
                list->base[j] = list->base[j + 1];
                list->base[j + 1] = temp;
            }
        }
    }
}

void reverse(Seqlist *list)//將順序表倒置
{
    if(list->size==0||list->size==1)
        return;
    int low=0,high=list->size-1;

    while(low<high)
    {
        ElemType temp=list->base[low];
        list->base[low]=list->base[high];
        list->base[high]=temp;
        low++;
        high--;
    }
}

void clear(Seqlist *list)
{
    list->size=0;
}

void destroy(Seqlist *list)//摧毀順序表
{
    free(list->base);
    list->base=NULL;
    list->capacity=0;
    list->size=0;
}

void merge(Seqlist *lt,Seqlist *la,Seqlist *lb)//把兩個順序表合併為一個
{
    lt->capacity=la->size+lb->size;
    lt->base=(ElemType*)malloc(sizeof(ElemType)*lt->capacity);
    if(!lb->base)
        exit(-1);
    int ia=0,ib=0,ic=0;
    while(ia<la->size&&ib<lb->size)
    {
        if(la->base[ia]<lb->base[ib])
        {
            lt->base[ic++]=la->base[ia++];
        }
        else
        {
            lt->base[ic++]=lb->base[ib++];

        }
    }
    while(ia<la->size)
    {
        lt->base[ic++]=la->base[ia++];
    }
    while(ib<lb->size)
    {
        lt->base[ic++]=lb->base[ib++];
    }
    lt->size=la->size+lb->size;
    show_list(lt);
}
#include "seqlist.h"

int main()
{
    Seqlist list;
    InitSeqlist(&list);
    //create_list(&list);
    ElemType item;
    int pos;
    int select=1;
    printf("*******************************************\n");
    printf("*[1]  push_back        [2]  push_front    *\n");
    printf("*[3]  show_list        [4]  pop_back      *\n");
    printf("*[5]  pop_front        [6]  insert_pos    *\n");
    printf("*[7]  find             [8]  length        *\n");
    printf("*[9]  delete_pos       [10] delete_value  *\n");
    printf("*[11] sort             [12] reverse       *\n");
    printf("*[13] clear            [14] merge         *\n");
    printf("*[0]  quit_system                         *\n");
    printf("*******************************************\n");
    while(select)
    {

        printf("請選擇:>>");
        scanf("%d",&select);
        if(select==0)
            break;
        switch(select)
        {
        case 1:
            printf("請輸入要插入的資料(-1結束)");
            while(scanf("%d",&item),item!=-1)
            {
                push_back(&list,item);
            }
            break;
        case 2:
            printf("請輸入要插入的資料(-1結束)");
            while(scanf("%d",&item),item!=-1)
            {
                push_front(&list,item);

            }
            break;
        case 3:
            show_list(&list);
            break;
        case 4:
            pop_back(&list);
            break;
        case 5:
            pop_front(&list);
            break;
        case 6:
            printf("請輸入要插入的資料:");
            scanf("%d",&item);
            printf("請輸入要插入的位置:");
            scanf("%d",&pos);
            insert_pos(&list,pos,item);
            break;
        case 7:
            printf("請輸入要查詢的資料:");
            scanf("%d",&item);
            pos=find(&list,item);
            if(pos=-1)
                printf("要查詢的元素不在順序表中");
            else
                printf("查詢元素的在順序表中的下標位置為:%d\n",pos);
            break;
        case 8:
            printf("順序表的長度為%d",length(&list));
            break;
        case 9:
            printf("請輸入要刪除的值的下標位置:");
            scanf("%d",&pos);
            delete_pos(&list,pos);
            break;
        case 10:
            printf("請輸入喲啊刪除的值");
            scanf("%d",&item);
            delete_val(&list,item);
            break;
        case 11:
            sort(&list);
            break;
        case 12:
            reverse(&list);
            break;
        case 13:
            clear(&list);
            break;
        case 14:
            Seqlist mylist,yourlist;
            ElemType item1,item2;
            InitSeqlist(&mylist);
            InitSeqlist(&yourlist);
            printf("請輸入順序表1中的元素值");
            while(scanf("%d",&item1),item1!=-1)
            {
                push_back(&mylist,item1);
            }
            printf("請輸入順序表2中的元素值");
            while(scanf("%d",&item2),item2!=-1)
            {
                push_back(&yourlist,item2!=-1);
            }
            merge(&list,&mylist,&yourlist);
            destroy(&mylist);
            destroy(&yourlist);
            break;
        case 15:
            create_list(&list);//順序表的建立,輸入資料
            break;
        default:
            printf("輸入的選擇錯誤");
            break;


        }
    }
    destroy(&list);
}