day3线性表&顺序表

本文详细介绍了顺序表的概念,如物理和逻辑上的连续性,并通过结构体定义了顺序表。文章提供了创建顺序表、表尾插入、删除、查找、修改、插入、删除、数据元素查找、修改和删除等操作的练习,并展示了如何在C语言中实现这些功能。此外,还涉及了顺序表的去重、排序和有序合并等高级操作。
摘要由CSDN通过智能技术生成

        今天对线性表中的顺序表进行了深入的研究,顺序表是在物理上连续逻辑上也连续的表,就和数组一样,它也可以用数组的角度来理解。也对顺序表的结构体定义法做了相关的学习,包括对其他结构体的嵌套等。顺序表结构体在申请空间时也跟其他结构体类似,只不过需要在主函数再进行一次判定空值,以便退出函数。顺序表在初始化的时候要定义它的长度,长度不能是变量,所以要用到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++];
	}
}

结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值