今天对线性表中的顺序表进行了深入的研究,顺序表是在物理上连续逻辑上也连续的表,就和数组一样,它也可以用数组的角度来理解。也对顺序表的结构体定义法做了相关的学习,包括对其他结构体的嵌套等。顺序表结构体在申请空间时也跟其他结构体类似,只不过需要在主函数再进行一次判定空值,以便退出函数。顺序表在初始化的时候要定义它的长度,长度不能是变量,所以要用到define宏定义来定义常量进行长度赋值,还有数据长度也需要赋值一个0。下面是今天的脑图:
顺序表相关练习:
1.建立一个顺序表进行以下功能的书写:
>顺序表空间申请
>顺序表在表尾插入+判空+判满
>顺序表遍历
>顺序表在表尾删除
>顺序表通过下表/位置查找O(1)
>顺序表通过下表/位置修改O(1)
>顺序表通过下表/位置插入O(n)
>顺序表通过下表/位置删除O(n)
>顺序表通过数据元素查找
>顺序表通过数据元素修改
>顺序表通过数据元素删除
>顺序表去重
>顺序表排序
>顺序表有序合并
main函数:
#include "head.h"
int main(int argc, const char *argv[])
{
Seqlist *p = CreateSpace();
if(p == NULL){
return 0;
}
//==============顺序表表尾插入============
int n;
datetype e;
printf("输入插入数据元素的个数:\n");
scanf("%d",&n);
if(n>MAXSIZE){
return 0;
}
for(int i = 0; i < n; i ++){
scanf("%d",&e);
InsertData(p,e);
}
printf("所有数据如下\n");
PrintData(p);
//==============顺序表表尾============
printf("删除尾部元素\n");
DeleteDateOne(p);
PrintData(p);
//==============顺序表下标查找============
int type = 0;
SeqlistSearch(p,type);
//==============顺序表下标修改============
SeqlistRevise(p,type);
printf("修改后的数据是:\n");
PrintData(p);
//==============顺序表下标插入============
SeqlistInsert(p);
printf("插入后的结果是:\n");
PrintData(p);
//==============顺序表下标删除============
SeqlistDelete(p);
printf("删除后的结果是:\n");
PrintData(p);
//==============顺序表数据元素查找============
SeqlistDataSearch(p);
//==============顺序表数据元素修改============
SeqlistDataRevise(p);
printf("修改后的数据是:\n");
PrintData(p);
//==============顺序表数据元素删除===========
SeqlistDataDelete(p);
printf("删除后的结果是:\n");
PrintData(p);
//==============顺序表去重=============
SeqlistToRepeat(p);
printf("去重后的数据是:\n");
PrintData(p);
//==============顺序表排序=============
SeqlistDataMaopao(p);
printf("排序后的结果是:\n");
PrintData(p);
//==============顺序表有序合并=============
Seqlist s1 = {6,56,89,92,107,124,200};
Seqlist s2 = {8,11,87,97,98,100,202,302,400};
Seqlist s3;
s3.len = 0;
printf("顺序表合并:\n表1:");
PrintData(&s1);
printf("表2:");
PrintData(&s2);
SeqlistMerge(&s1,&s2,&s3);
printf("合并结果是: \n");
PrintData(&s3);
free(p);
p=NULL;
return 0;
}
head头文件:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef int datetype;
typedef struct{
int len;
datetype data[MAXSIZE];
}Seqlist;
Seqlist *CreateSpace();
int isFall(Seqlist *p);
void InsertData(Seqlist *p,datetype e);
void PrintData(Seqlist *p);
int isEmpty(Seqlist *p);
void DeleteDateOne(Seqlist *p);
void SeqlistSearch(Seqlist *p,int type);
void SeqlistRevise(Seqlist *p,int type);
void SeqlistInsert(Seqlist *p);
void SeqlistDelete(Seqlist *p);
void SeqlistDataSearch(Seqlist *p);
void SeqlistDataRevise(Seqlist *p);
void SeqlistDataDelete(Seqlist *p);
void SeqlistToRepeat(Seqlist *p);
void SeqlistDataMaopao(Seqlist *p);
void SeqlistMerge(Seqlist *p,Seqlist *q,Seqlist *w);
fun函数:
#include "head.h"
Seqlist *CreateSpace(){
Seqlist *p = (Seqlist *)malloc(sizeof(Seqlist));
if(p == NULL){
return NULL;
}
p->len = 0; //表示顺序表数据元素的个数为0,置空
return p;
}
int isFall(Seqlist *p){
if(p->len == MAXSIZE){
return -1;
}
return 0;
}
void InsertData(Seqlist *p,datetype e){
if(isFall(p)){
return;
}
p->data[p->len++] = e;
}
int isEmpty(Seqlist *p){
if(p->len == 0){
return -1;
}
return 0;
}
void DeleteDateOne(Seqlist *p){
if(isEmpty(p))
return;
p->len--;
}
void PrintData(Seqlist *p){
for(int i = 0; i < p->len; i ++){
printf("%d ",p->data[i]);
}
printf("\n");
}
void SeqlistSearch(Seqlist *p,int type){
printf("请输入要查找的下标:\n");
scanf("%d",&type);
if(isEmpty(p)){
printf("该表为空:\n");
return;
}
if(type < p->len && type >= 0){
for(int i = 0; i < p->len; i ++){
if(type == i){
printf("查询结果是:%d\n",p->data[type]);
return;
}
}
}
printf("该下标找不到,请重新输入\n");
SeqlistSearch(p,type);
}
void SeqlistRevise(Seqlist *p,int type){
printf("请输入你要修改的值的下标:\n");
scanf("%d",&type);
if(type < p->len && type >= 0){
for(int i = 0; i < p->len; i ++){
if(type == i){
printf("请输入你要修改的值:\n");
scanf("%d",&p->data[type]);
return;
}
}
}
printf("该下标找不到,请重新输入下标:\n");
SeqlistRevise(p,type);
}
void SeqlistInsert(Seqlist *p){
if(isFall(p)){
printf("顺序表已满,无法插入");
return;
}
int n;
printf("请输入要插入的下标:\n");
scanf("%d",&n);
if(n < p->len && n >= 0){
for(int i = p->len++; i > 0; i --){
if(i == n){
printf("请输入要插入的值:\n");
scanf("%d",&p->data[i]);
printf("插入成功!");
return;
}
p->data[i] = p->data[i-1];
}
}
printf("该下标找不到,请重新输入下标:\n");
SeqlistInsert(p);
}
void SeqlistDelete(Seqlist *p){
if(isEmpty(p)){
printf("该表为空,不能删除元素\n");
return;
}
int n;
printf("请输入要删除的下标:\n");
scanf("%d",&n);
if(n < p->len && n >= 0){
p->len --;
for(int i = 0; i < p->len; i ++){
if(i < n){
continue;
}
p->data[i] = p->data[i+1];
}
printf("删除成功!");
return;
}
printf("该下标找不到,请重新输入下标:\n");
SeqlistDelete(p);
}
void SeqlistDataSearch(Seqlist *p){
if(isEmpty(p)){
printf("该表为空,不能查找数据\n");
return;
}
int n;
printf("请输入你要查找的数据:\n");
scanf("%d",&n);
int type = 0;
for(int i = 0; i < p->len; i ++){
if(n == p->data[i]){
printf("查找成功!\n");
printf("该数据的第%d个下标是: %d\n",type+1,i);
type ++;
}
}
if(type == 0){
printf("查找失败!该表没有这个数据请重新输入数据\n");
SeqlistDataSearch(p);
}
}
void SeqlistDataRevise(Seqlist *p){
if(isEmpty(p)){
printf("该表为空,不能修改元素\n");
return;
}
int n;
printf("请输入你想要修改的值:\n");
scanf("%d",&n);
for(int i = 0; i < p->len; i ++){
if(n == p->data[i]){
printf("请将这个值赋一个新值:\n");
scanf("%d",&p->data[i]);
return;
}
}
printf("修改失败!该表没有这个数据请重新输入数据\n");
SeqlistDataRevise(p);
}
void SeqlistDataDelete(Seqlist *p){
if(isEmpty(p)){
printf("该表为空,不能进行删除操作\n");
return;
}
int n;
printf("请输入你要删除的数据\n");
scanf("%d",&n);
int type = 0;
for(int i = 0; i < p->len; i ++){
if(n != p->data[i] && type == 0){
continue;
}
type++;
if(type == 1){
p->len --;
}
p->data[i] = p->data[i+1];
}
if(type == 0){
printf("删除失败!该表没有这个数据请重新输入数据\n");
SeqlistDataDelete(p);
}
}
void SeqlistToRepeat(Seqlist *p){
for(int i = 0; i < p->len; i++){
for(int j = i+1; j < p->len; j++){
if(p->data[i] == p->data[j]){
p->len --;
for(int w = j; w < p->len; w++){
p->data[w] = p->data[w+1];
}
j --;
}
}
}
}
void SeqlistDataMaopao(Seqlist *p){
int n = p->len - 1;
while(n>0){
int type = 0;
for(int i = 0; i < n - 1; i ++){
if(p->data[i] > p->data[i+1]){
int a = p->data[i];
p->data[i] = p->data[i+1];
p->data[i+1] = a;
type ++;
}
}
if(type == 0){
break;
}
n --;
}
}
void SeqlistMerge(Seqlist *p,Seqlist *q,Seqlist *w){
int i = 0;
int j = 0;
while(i < p->len && j < q->len){
if(p->data[i] <= q->data[j]){
w->data[w->len++] = p->data[i++];
}else{
w->data[w->len++] = q->data[j++];
}
}
if(i < p->len){
w->data[w->len++] = p->data[i++];
}
if(j < q->len){
w->data[w->len++] = q->data[j++];
}
}
结果如下: