顺序表的基本算法详解编程语言

#define _CRT_SECURE_NO_WARNINGS 1 
#ifndef __SEQLIST_H__   
#define __SEQLIST_H__   
 
#include<stdio.h>   
#include<stdlib.h>   
#include<assert.h>   
#include<string.h>   
 
#define MAX 100   
typedef int DataType; 
 
typedef struct Seqlist 
{ 
    DataType Data[MAX]; 
    DataType sz; 
}Seqlist, *pSeqlist; 
 
void PrintSeqlist(pSeqlist pSeq);         //打印顺序表   
void InitSeqlist(pSeqlist pSeq);          //初始化顺序表       
void PushBack(pSeqlist pSeq, DataType x); //从后面插入一个元素   
void Popback(pSeqlist pSeq);              //抛出最后面的   
void PushFornt(pSeqlist pSeq, DataType x);//在头部插入一个元素   
void PopFornt(pSeqlist pSeq);             //删除头元素   
void Insert(pSeqlist pSeq, int pos, DataType x);//指定位置插入   
void Remove(pSeqlist pSeq, DataType x);   //移除第一个出现的x   
void RemoveAll(pSeqlist pSeq, DataType x);//移除全部的x   
void Sort(pSeqlist pSeq);                 //排序顺序表     
int BinarySearch(pSeqlist pSeq, DataType x);//二分查找,返回元素所在下标   
 
#endif         //__SEQLIST_H__   
 
 
 
 
#define _CRT_SECURE_NO_WARNINGS 1 
#include"seqlist.h"   
 
void PrintSeqlist(pSeqlist pSeq) 
{ 
    assert(pSeq); 
    int i = 0; 
    if (pSeq->sz == 0)     //异常情况,表为空                               
    { 
        printf("表是空表/n"); 
    } 
    else 
    { 
        for (i = 0; i < pSeq->sz; i++) 
        { 
            printf("%d  ", pSeq->Data[i]); 
        } 
        printf("/n"); 
    } 
} 
 
 
void InitSeqlist(pSeqlist pSeq) 
{ 
    assert(pSeq); 
    pSeq->sz = 0; 
} 
 
 
void PushBack(pSeqlist pSeq, DataType x) 
{ 
    assert(pSeq); 
    if (pSeq->sz == MAX)                                        //异常情况,表为满   
    { 
        printf("表已满/n"); 
        return; 
    } 
    pSeq->Data[pSeq->sz] = x; 
    pSeq->sz++; 
} 
 
 
void Popback(pSeqlist pSeq) 
{ 
    assert(pSeq); 
    if (pSeq->sz == 0)                                           //异常情况,表为空   
    { 
        printf("表已空/n"); 
        return; 
    } 
    pSeq->sz--; 
} 
 
 
void PushFornt(pSeqlist pSeq, DataType x) 
{ 
    assert(pSeq); 
    int i = 0; 
    if (pSeq->sz == MAX)   //异常情况,表为满                                         
    { 
        printf("表已满/n"); 
        return; 
    } 
    for (i = pSeq->sz; i > 0; i--) 
    { 
        pSeq->Data[i] = pSeq->Data[i - 1]; 
    } 
    pSeq->Data[0] = x; 
    pSeq->sz++; 
} 
 
 
void PopFornt(pSeqlist pSeq) 
{ 
    assert(pSeq); 
    int i = 0; 
    if (pSeq->sz == 0)     //异常情况,表为空                                         
    { 
        printf("表已空/n"); 
        return; 
    } 
    for (i = 0; i< pSeq->sz - 1; i++) 
    { 
        pSeq->Data[i] = pSeq->Data[i + 1]; 
    } 
    pSeq->sz--; 
} 
 
 
void Insert(pSeqlist pSeq, int pos, DataType x) 
{ 
    assert(pSeq); 
    int i = 0; 
    if (pSeq->sz == MAX)  //异常情况,表为满                                    
    { 
        printf("表已满/n"); 
        return; 
    } 
    if (pos > pSeq->sz&&pos<0)   //插入位置小于0或者大于sz都是不合法,顺序表要求位置连续                             
    { 
        printf("插入位置不合法/n"); 
        return; 
    } 
    for (i = pSeq->sz; i>pos; i--) 
    { 
        pSeq->Data[i] = pSeq->Data[i - 1]; 
    } 
    pSeq->Data[pos] = x; 
    pSeq->sz++; 
} 
 
 
void Remove(pSeqlist pSeq, DataType x) 
{ 
    assert(pSeq); 
    int i = 0; 
    if (pSeq->sz == 0)     //异常情况,表为空                                        
    { 
        printf("表已空/n"); 
        return; 
    } 
    while (i<pSeq->sz) 
    { 
        if (pSeq->Data[i] == x) 
        { 
            for (; i< pSeq->sz - 1; i++) 
            { 
                pSeq->Data[i] = pSeq->Data[i + 1]; 
            } 
            pSeq->sz--; 
            break; 
        } 
        i++; 
    } 
} 
 
 
void RemoveAll(pSeqlist pSeq, DataType x) 
{ 
    assert(pSeq); 
    int i = 0; 
    int j = 0; 
    if (pSeq->sz == 0) //异常情况,表为空                                             
    { 
        printf("表已空/n"); 
        return; 
    } 
    while (i <= pSeq->sz) 
    { 
        if (pSeq->Data[i] == x) 
        { 
            for (j = i; j< pSeq->sz - 1; j++) 
            { 
                pSeq->Data[j] = pSeq->Data[j + 1]; 
            } 
            pSeq->sz--; 
        } 
        i++; 
    } 
} 
 
 
void Sort(pSeqlist pSeq) 
{ 
    assert(pSeq); 
    if (pSeq->sz == 0)  //异常情况,表为空                                            
    { 
        printf("表已空/n"); 
        return; 
    } 
    int i = 0; 
    int j = 0; 
    int flag = 0; 
    for (i = 0; i < pSeq->sz - 1; i++) 
    { 
        flag = 0; 
        for (j = 0; j < pSeq->sz - i - 1; j++) 
        { 
            if (pSeq->Data[j]>pSeq->Data[j + 1]) 
            { 
                DataType tmp = pSeq->Data[j]; 
                pSeq->Data[j] = pSeq->Data[j + 1]; 
                pSeq->Data[j + 1] = tmp; 
                flag = 1; 
            } 
        } 
        if (flag == 0) 
            break; 
    } 
} 
 
 
int BinarySearch(pSeqlist pSeq, DataType x) 
{ 
    assert(pSeq); 
    if (pSeq->sz == 0)  //异常情况,表为空                                        
    { 
        printf("表已空/n"); 
        return -1; 
    } 
    int left = 0; 
    int right = pSeq->sz - 1; 
    int mid = (left&right) + ((left^right) >> 1);                    //mid取平均值   
    while (left<right) 
    { 
        if (x>pSeq->Data[mid]) 
        { 
            left = mid + 1; 
            mid = (left&right) + ((left^right) >> 1); 
        } 
        else if (x<pSeq->Data[mid]) 
        { 
            right = mid - 1; 
            mid = (left&right) + ((left^right) >> 1); 
        } 
        else 
        { 
            printf("%d/n", mid); 
            return mid;                                                        //返回这个元素所在的下标   
        } 
    } 
    return -1; 
} 
 
 
 
#define _CRT_SECURE_NO_WARNINGS 1 
#include"seqlist.h"   
 
 
void menu() 
{ 
    printf("*********************************/n"); 
    printf("0.exit            1.PrintSeqlist /n"); 
    printf("2.InitSeqlist     3.PushBack     /n"); 
    printf("4.Popback         5.PushFornt    /n"); 
    printf("6.PopFornt        7.Insert       /n"); 
    printf("8.Remove          9.RemoveAll    /n"); 
    printf("10.Sort           11.BinarySearch/n"); 
    printf("请输入:>"); 
} 
 
void test(pSeqlist pSeq) 
{ 
    DataType x = 0; 
    int n = 0; 
    int pos = 0; 
    while (1) 
    { 
        menu(); 
        scanf("%d", &n); 
        switch (n) 
        { 
        case 0: 
            exit(1); 
            break; 
        case 1: 
            PrintSeqlist(pSeq); 
            break; 
        case 2: 
            InitSeqlist(pSeq); 
            break; 
        case 3: 
            printf("请输入元素/n"); 
            scanf("%d", &x); 
            PushBack(pSeq, x); 
            break; 
        case 4: 
            Popback(pSeq); 
            break; 
        case 5: 
            printf("请输入元素/n"); 
            scanf("%d", &x); 
            PushFornt(pSeq, x); 
            break; 
        case 6: 
            PopFornt(pSeq); 
            break; 
        case 7: 
            printf("请输入元素/n"); 
            scanf("%d", &x); 
            printf("请输入插入位置/n"); 
            scanf("%d", &pos); 
            Insert(pSeq, pos, x); 
            break; 
        case 8: 
            printf("请输入元素/n"); 
            scanf("%d", &x); 
            Remove(pSeq, x); 
            break; 
        case 9: 
            printf("请输入元素/n"); 
            scanf("%d", &x); 
            RemoveAll(pSeq, x); 
            break; 
        case 10: 
            Sort(pSeq); 
            break; 
        case 11: 
            printf("请输入元素/n"); 
            scanf("%d", &x); 
            BinarySearch(pSeq, x); 
            break; 
        default: 
            printf("输入无效/n"); 
            break; 
        } 
    } 
} 
 
 
 
int main() 
{ 
    Seqlist pSeq; 
    memset(pSeq.Data, 0, sizeof(DataType)*MAX); 
    pSeq.sz = 0; 
    test(&pSeq); 
    system("pause"); 
    return 0; 
}

【不足】
反馈信息做得不够好

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18198.html

(0)
上一篇 2021年7月19日 20:56
下一篇 2021年7月19日 20:56

相关推荐

发表回复

登录后才能评论