数据结构——顺序表(sequence list)

/* sequenceList.c */
/* 顺序表 */
/* 线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表中的各项数据元素,用这种存储形式的线性表称为顺序表。 */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAXSIZE 10

/* 顺序表结构 */
typedef struct {
    int data[MAXSIZE];     /* 数据列表 */
    int last;             /* 最后一个元素索引 */    
} SeqList;

/* 用户界面 */
void interface(void){
    puts("+**********************************************+");
    puts("+  0, quit                退出                 +");
    puts("+  1, insert              插入                 +");
    puts("+  2, delete              删除                 +");
    puts("+  3, locate              查找                 +");
    puts("+  4, traverse            遍历                 +");
    puts("+  5, fill                填充                 +");
    puts("+  6, sort(ascend)        排序(升序)         +");
    puts("+  7, sort(descend)       排序(降序)         +");
    puts("+**********************************************+");
}

/* 顺序表函数声明 */
SeqList *initSeqList();
int insertSeqList(SeqList*, int, int);
int deleteSeqList(SeqList*, int);
int locateSeqList(SeqList*, int);
void traverseSeqList(SeqList*);
void fillSeqList(SeqList*, int);
void sortSeqList(SeqList*, bool);

/* 程序主入口 */
int main(){
    SeqList *sl = initSeqList();
    int flag, number, index;

    interface();
    for(;;){
        printf("Command: ");
        scanf("%d", &flag);
        switch(flag){
            case 0: printf("Bye!\n"); return 0; break;
            case 1: 
                printf("Enter index and nuumber: ");
                scanf("%d %d", &index, &number);
                insertSeqList(sl, index, number);
                break;
            case 2:
                printf("Enter index: ");
                scanf("%d", &index);
                deleteSeqList(sl, index);
                break;
            case 3:
                printf("Enter number: ");
                scanf("%d", &number);
                printf("index: %d\n", locateSeqList(sl, number));
                break;
            case 4:
                traverseSeqList(sl);
                break;
            case 5:
                printf("Enter number: ");
                scanf("%d", &number);
                fillSeqList(sl, number);
                break;
            case 6:
                sortSeqList(sl, true);
                break;
            case 7:
                sortSeqList(sl, false);
                break;
        }
    }

    return 0;    
}

/* 顺序表函数实现*/
/* 初始化顺序表 */
SeqList *initSeqList(){
    SeqList *sl = (SeqList*)malloc(sizeof(SeqList));
    sl->last = -1;
    return sl;
}
/* 顺序表的插入 */
int insertSeqList(SeqList *sl, int index, int num){
    /* 查看是否顺序表已满 */
    if(sl->last==MAXSIZE-1){
        printf("Sorry, there's no room left in sequence list.\n");
        return -1;
    }
    /* 检查插入位置是否合理 */
    if(index < 0 || index > MAXSIZE-1){
        printf("Sorry, wrong position.\n");
        return 1;
    }
    /* 插入数据 */
    /* 从尾巴开始往前遍历,将index位置(包括index)后面所有元素往后移动一位 */
    /* 空出index位置插入num */
    for(int i = sl->last; i >= index; i--){
        sl->data[i+1] = sl->data[i]; 
    }    
    sl->data[index] = num;
    /* 如果last比index大,说明last还是指向最后一位,加一即可 */
    /* 反之,则说明last在index前面,需要将last指向index */
    if(sl->last>index){
        sl->last++;
    }else{
        sl->last = index;
    }
    
    return 0; 
}
/* 删除顺序表元素 */
int deleteSeqList(SeqList *sl, int index){
    /* 检查是否为空 */
    if(sl->last==-1){
        printf("Sorry, sequence list is empty.\n");
        return 1;
    }    
    /* 检查是否在0-L->last范围内 */
    if(index < 0 || index > sl->last+1){
        printf("Sorry, index overflow error!\n");    
        return -1;    
    }
    /* 删除数据 */
    /* 从头到尾遍历,找到index,将其后面的所有元素往上提,last-- */
    for(int i = index; i < sl->last; i++){
        sl->data[i] = sl->data[i+1];    
    }
    sl->last--;

    return 0;
}
/* 按值查找顺序表元素 */
int locateSeqList(SeqList *sl, int num){
    for(int i = 0; i <= sl->last; i++){
        if(sl->data[i]==num)
            return i;
    }    
    return -1;
}
/* 遍历顺序表 */
void traverseSeqList(SeqList *sl){
    for(int i = 0; i <= sl->last; i++){
        printf("%d -> ", sl->data[i]);
    }    
    printf("NULL\n");
}
/* 用num填充顺序表 */
void fillSeqList(SeqList *sl, int num){
    for(int i = 0; i < MAXSIZE; i++){
        sl->data[i] = num;
        sl->last = MAXSIZE-1;
    }
}
/* 排序顺序表 */
void sortSeqList(SeqList *sl, bool ascend){
    for(int i = 0; i < sl->last; i++){
        for(int j = i+1; j <= sl->last; j++){
            if(ascend){
                if(sl->data[i]>sl->data[j]){
                    sl->data[i] ^= sl->data[j];
                    sl->data[j] ^= sl->data[i];
                    sl->data[i] ^= sl->data[j];
                }
            }else{
                if(sl->data[i]<sl->data[j]){
                    sl->data[i] ^= sl->data[j];
                    sl->data[j] ^= sl->data[i];
                    sl->data[i] ^= sl->data[j];
                }
            }
        }
    }
}

 

posted @ 2019-09-09 14:06  no樂on  阅读(1356)  评论(0编辑  收藏  举报