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

#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/18198.html

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

相关推荐

发表回复

登录后才能评论