数据结构-线性表(严书代码实现)

数据结构-线性表的顺序表示代码

//头文件内容实现
#ifndef SEQLIST_H_INCLUDED
#define SEQLIST_H_INCLUDED
#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<math.h>
#include<sys/timeb.h>
#include<stdarg.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Boolean;
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
typedef int ElemType;
struct SqList
{
  ElemType *elem;
  int length;
  int listsize;
};

void InitList(SqList &L)
{
  L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  if(!L.elem)
    exit(OVERFLOW);
  L.length=0;
  L.listsize=LIST_INIT_SIZE;
}
void DestroyList(SqList &L)
{
  free(L.elem);
  L.elem=NULL;
  L.length=0;
  L.listsize=0;
}
void ClearList(SqList &L)
{
  L.length=0;
}
Status ListEmpty(SqList L)
{

  if(L.length==0)
    return TRUE;
  else
    return FALSE;
}
int ListLength(SqList L)
{
  return L.length;
}
Status GetElem(SqList L, int i, ElemType &e)
{

  if(i<1 || i>L.length)
    return ERROR;
  e=*(L.elem+i-1);
  return OK;
}
int LocateElem(SqList L, ElemType e, Status(*compare)(ElemType, ElemType))
{


  int i=1;
  ElemType *p=L.elem;
  while(i<=L.length && !compare(*p++, e))
    i++;
  if(i<=L.length)
    return i;
  else
    return 0;
}
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e)
{


  int i=2;
  ElemType *p=L.elem+1;
  while(i<=L.length && *p!=cur_e)
  { p++;
    i++;
  }
  if(i>L.length)
    return ERROR;
  else
  { pre_e=*--p;
    return OK;
  }
}
Status NextElem(SqList L, ElemType cur_e, ElemType &next_e)
{


  int i=1;
  ElemType *p=L.elem;
  while(i<L.length && *p!=cur_e)
  { p++;
    i++;
  }
  if(i==L.length)
    return ERROR;
  else
  { next_e=*++p;
    return OK;
  }
}
Status ListInsert(SqList &L, int i, ElemType e)
{

  ElemType *newbase, *q, *p;
  if(i<1 || i>L.length+1)
    return ERROR;
  if(L.length==L.listsize)
  { 
    newbase=(ElemType*)realloc(L.elem, (L.listsize+LIST_INCREMENT)*
    sizeof(ElemType));
    if(!newbase)
      exit(OVERFLOW);
    L.elem=newbase;
    L.listsize+=LIST_INCREMENT;
  }
  q=L.elem+i-1;
  for(p=L.elem+L.length-1; p>=q; --p)
    *(p+1)=*p;
  *q=e;
  L.length++;
  return OK;
}
Status ListDelete(SqList &L, int i, ElemType &e)
{

  ElemType *p, *q;
  if(i<1 || i>L.length)
    return ERROR;
  p=L.elem+i-1;
  e=*p;
  q=L.elem+L.length-1;
  for(p++; p<=q; p++)
    *(p-1)=*p;
  L.length--;
  return OK;
}
void ListTraverse(SqList L, void(*visit)(ElemType&))
{
  ElemType *p=L.elem;
  for(int i=1; i<=L.length; i++)
    visit(*p++);
  printf("\n");
}

Status equal(ElemType c1, ElemType c2)
{
  if(c1==c2)
    return TRUE;
  else
    return FALSE;
}
int comp(ElemType a, ElemType b)
{
  if(a==b)
    return 0;
  else
    return (a-b)/abs(a-b);
}
void print(ElemType c)
{
  printf("%d ", c);
}
void print1(ElemType &c)
{
  printf("%d ", c);
}
void print2(ElemType c)
{
  printf("%c ", c);
}
#endif // SEQLIST_H_INCLUDED

#include <iostream>
#include "SeqList.h"
Status sq(ElemType c1, ElemType c2)
{
        if (c1 == c2 * c2)
                return TRUE;
        else
                return FALSE;
}
void dbl(ElemType &c)
{
        c *= 2;
}
/**
 * @brief 算法思想
 * 搜索整个顺序表,查找最小值元素并记住其位置,搜索结束后用最后一个元素补空出的原最小值的位置
 * @param L 
 * @return Status 
 */
Status Del_Min(SqList &L)
{
        if (L.length == 0)
        {
                printf("this is a Null List");
                return TRUE;
        }
        if (L.length == 1)
        {
                L.length--;
                printf("delete after is null list");
        }
        int min = *L.elem;
        int minlo = 0;
        for (int i = 1; i < L.length; i++)
        {

                if (*(L.elem + i) < min)
                {
                        min = *(L.elem + i);
                        minlo = i;
                }
        }
        *(L.elem + minlo) = *(L.elem + L.length-1);
        L.length--;
        return TRUE;
}
//逆置
void Reverse(SqList &L){
        int temp;
        for (int i = 0; i < L.length/2; i++)
        {
                temp = *(L.elem+i);
                *(L.elem+i) = *(L.elem+L.length-1-i);
                *(L.elem+L.length-1-i) = temp;
        }
        
        
}
//循环左移,算法设计思想,设计一个临时SqList链表,首先计算每个数据元素在移位后的位置,将其装入临时线性表,最后将临时线性表与传入表指针统一
void LeftMove(SqList &L,int p){
        SqList LTemp;
        InitList(LTemp);
        LTemp.length = L.length;
        int temp;
        for (int i = 0; i < L.length; i++)
        {
                if (i<p)
                {
                        *(LTemp.elem+L.length+i-p) = *(L.elem+i);

                }else{
                        *(LTemp.elem+i-p) = *(L.elem+i);
                }
                
        }
        L = LTemp;
        
}
/**
 * @brief 
 * 算法的基本设计思想
 * 分别求两个升序序列A、B的中位数,设为a和b,求序列A、B的中位数过程如下:
 * 1.若a=b,则a或b即为所求中位数,算法结束
 * 2.若a<b,则舍弃序列A中较小的一半,同时舍弃序列B中较大的一半,要求舍弃的长度相等
 * 3.若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求舍弃的长度相等。
 * @param A 
 * @param B 
 * @param n 
 * @return int 
 */
int M_Search(int A[],int B[],int n){
        int s1 = 0,d1 = n-1,m1,s2 = 0,d2 = n-1,m2;
        //分别表示序列A和B的首位数、末位数和中位数
        while (s1!=d1||s2!=d2)
        {
                m1 = (s1+d1)/2;
                m2 = (s2+d2)/2;
                if (A[m1]==B[m2])
                {
                        return A[m1];
                }
                if (A[m1]<B[m2])
                {
                        if ((s1+d1)%2 == 0)
                        {
                                s1 = m1;
                                d2 = m2;
                        }
                        else{
                                s1 = m1 + 1;
                                d2 = m2;
                        }
                        
                }else{
                        if ((s2+d2)%2 == 0)
                        {
                                d1 = m1;
                                s2 = m2;
                        }else{
                                d1 = m1;
                                s2 = m2+1;
                        }
                        
                }
                
                
        }
        return A[s1]<B[s2]?A[s1]:B[s2];
}

int Majority(int A[],int n){
        int i,c,count = 1;
        c = A[0];
        for (int i = 1; i < n; i++)
        {
                if (A[i]==c)
                {
                        count ++;
                }else{
                        if (count>0)
                        {
                                count--;
                        }else{
                                c = A[i];
                                count = 1;
                        }
                        
                }   
        }
        if (count>0)
        {
                for ( count=i = 0; i < n; i++)
                {
                        if (A[i]==c)
                        {
                                count++;
                        }
                        
                }
                
        }
        if (count>n/2)
        {
                return c;
        }else
                return -1;
}
int findMissMin(int A[],int n){
        int i,*B;
        B = (int *)malloc(sizeof(int)*n);
        memset(B,0,sizeof(int)*n);
        for ( i = 0; i < n; i++)
        {
                if (A[i]>0&&A[i]<=n)
                {
                        B[A[i]-1] = 1;
                }
        }
        for ( i = 0; i < n; i++)
        {
                if(B[i]==0) break;
        }
        return i + 1;
        
        
}
#define INT_MAX 0x7fffffff;
int abs_(int a){
        if (a<0)
        {
                return -a; 
        }else
                return a;
        
}
bool xls_min(int a,int b,int c){
        if (a<=b&&a<=c)
        {
                return true;
        }return false;
        
}
int findMinofTrip(int A[],int n,int B[],int m,int C[],int p){
        int i = 0,j = 0,k = 0,D_min=INT_MAX;
        int D;
        while(i<n&&j<m&&k<p&&D_min>0){
                D=abs_(A[i]-B[j])+abs_(B[j]-C[k])+abs_(C[k]-A[i]);
                if (D<D_min)
                {
                        /* code */
                        D_min = D;
                }
                if (xls_min(A[i],B[j],C[k]))
                {
                        i++;
                }
                else if (xls_min(B[j],C[k],A[i]))
                {
                        j++;
                }
                else k++;
                        
                
                
                
        }
        return D_min;
}
int main()
{
        SqList L;
        ElemType e, e0;
        Status i,j;
        InitList(L);

        for (j = 1; j <= 5; j++)
                i = ListInsert(L, 1, j);
        for (int i = 0; i < L.length; i++)
        {
                printf("this List ele is %d\n",*(L.elem+i));
        }
        /**
         * @brief Construct a new Del_Min object
         * 删除最小元素测试
        Del_Min(L);
         */
        //Reverse(L);
        //LeftMove(L,1);
        int a[] = {1,5,5,5,9};
        int b[] = {2,4,6,8,100};
        //int M_S = M_Search(a,b,5);
        int maj = Majority(a,5);
        printf("shtisi is a maj%d\n",maj);
        return 0;
}

此为高一凡书代码,由于代码没有分化,此为分化代码。自行分割实现。后续代码看后续博客内容即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值