c语言线性表之顺序表实现

头文件

//避免重复编译
#ifndef __SEQLIST_H__
#define __SEQLIST_H__

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

#define SEQLIST_INIT_SIZE 8
#define INC_SIZE	3

typedef int ElmeType;
typedef struct SeqList 
{	
	ElmeType *base;
	int		capacity;
	int		size;

}SeqList;
bool Inc(SeqList *list);
void InitSeqList(SeqList *list);
void push_back(SeqList *list,ElmeType x);
void push_front(SeqList *list,ElmeType x);
void show_list(SeqList*list);
void pop_back(SeqList *list);
void pop_front(SeqList *list);
void insert_pos(SeqList *list,ElmeType x,int pos);
int  find(SeqList *list,ElmeType key);
int  length(SeqList *list);
void delete_pos(SeqList *list,int pos);
void delete_val(SeqList *list,ElmeType key);
void sort(SeqList *list);
void resver(SeqList *list);
void clear(SeqList *list);
void destroy(SeqList *list);
void merge(SeqList *lt,SeqList *la,SeqList *lb);

#endif

实现函数

#include "SeqList.h"

void merge(SeqList *lt,SeqList *la,SeqList *lb){

    lt->capacity = la->size+lb->size;
    lt->base=(ElmeType*)malloc(sizeof(ElmeType)*lt->capacity);
    assert(lt->base!=NULL);

    int ia=0;
    int ib=0;
    int ic=0;
    while (ia<la->size &&ib<lb->size)
    {   
        if(la->base[ia]<lb->base[ib])
            lt->base[ic++]=la->base[ia++];
        else
            lt->base[ic++]=lb->base[ib++];
    }
    while (ia<la->size)
    {
        lt->base[ic++]=la->base[ia++];
    }
    while (ib<lb->size)
    {
        lt->base[ic++]=lb->base[ib++];
    }


    lt->size=la->size+lb->size;

}



bool Inc(SeqList *list){
    ElmeType *newbase =(ElmeType *)realloc(list->base,sizeof(ElmeType)*(INC_SIZE+SEQLIST_INIT_SIZE));
    if(newbase==NULL){
        printf("分配空间失败,内存不足");
        return false;
    }
    list->base=newbase;
    list->capacity+=INC_SIZE;
    return true;
}

void InitSeqList(SeqList *list){

    list->base = (ElmeType *)malloc(sizeof(ElmeType)*SEQLIST_INIT_SIZE);
    assert(list->base!=NULL);
    list->capacity=SEQLIST_INIT_SIZE;
    list->size=0;
}

void push_back(SeqList *list,ElmeType x){
    if(list->size>=list->capacity&& !Inc(list)){
        printf("顺序表空间已满,%d不能尾部插入数据\n",x);
        return;
    }
    list->base[list->size]=x;
    list->size++;
}
void push_front(SeqList *list,ElmeType x){
    if(list->size>=list->capacity){
        printf("超出数组大小\n");
        return;
    }
    for (int i = list->size; i >0; --i)
    {   
        list->base[i]=list->base[i-1];
    }
    list->base[0]=x;
    list->size++;   
}

void show_list(SeqList*list){
    for (int i = 0; i <list->size; ++i)
    {
        printf("%4d",list->base[i]);
    }
    printf("\n");
}
void pop_back(SeqList *list){
    if(list->size==0){
        printf("数组为空");
        return;
    }
    list->size--;
}

void pop_front(SeqList *list){
    if(list->size==0){
        printf("数组为空");
        return;
    }
    for (int i = 0; i < list->size-1; i++)
    {
        list->base[i]=list->base[i+1];  
    }
    list->size--;
}

void insert_pos(SeqList *list,ElmeType x,int pos){
    if (pos<0 ||pos>list->size)
    {
        printf("插入失败:\n");
        return;
    }
    if(list->size>=list->capacity&& !Inc(list)){
        printf("顺序表空间已满,%d不能尾部插入数据\n",x);
        return;
    }
        for (int i=list->size;i>pos;--i){
            list->base[i]=list->base[i-1];
        }
        list->base[pos]=x;
        list->size++;
    
}
int find(SeqList *list,ElmeType key){
    for (int i = 0; i < list->size; ++i)
    {
        if (list->base[i]==key)
        {
            return i;
        }
    }
    return -1;
}
int length(SeqList *list){
    return list->size;
}

void delete_pos(SeqList *list,int pos){
    if(pos <0||pos>=list->size){
        printf("输入的位置非法!不能删除数据\n");
        return;
    }
    for (int i = pos; i <list->size-1; ++i)
    {
       list->base[i]=list->base[i+1];
    }
    list->size--;
    

}

void delete_val(SeqList *list,ElmeType key){

    int pos=find(list,key);
    if(pos ==-1){
        printf("要删除的数据不存在\n");
        return;
    }
    delete_pos(list,pos);
}
//冒泡排序
void sort(SeqList *list){
    for (int i = 0; i < list->size-1; ++i)
    {
        for (int j=0;j<list->size-i-1;++j){
            if (list->base[j]>list->base[j+1])
            {
                ElmeType temp=list->base[j];
                list->base[j]=list->base[j+1];
                list->base[j+1]=temp;
            } 
        }
    }
}

void resver(SeqList *list){
    if(list->size==0||list->size==1)
        return;
    int low=0;
    int high=list->size-1;
    ElmeType tmp;
    while (low<high)
    {
        tmp=list->base[low];
        list->base[low]=list->base[high];
        list->base[high]=tmp;
        low++;
        high--;
    }
}
void clear(SeqList *list){
    list->size=0;
}
void destroy(SeqList *list){
    free(list->base);
    list->base=NULL;
    list->capacity=0;
    list->size=0;
}

主函数

#include "SeqList.h"



void main(){
	SeqList mylist,youlist,list;
	InitSeqList(&mylist);
	InitSeqList(&youlist);
	
	push_back(&mylist,1);
	push_back(&mylist,3);
	push_back(&mylist,5);
	push_back(&mylist,7);
	push_back(&mylist,9);

	push_back(&youlist,2);
	push_back(&youlist,4);
	push_back(&youlist,6);
	push_back(&youlist,8);
	push_back(&youlist,11);
	push_back(&youlist,12);

	merge(&list,&mylist,&youlist);
	show_list(&list);
	
}
/*
int main()
{
	SeqList mylist;
	InitSeqList(&mylist);
	ElmeType Item;
	int select =1;
	int pos;
	while (select)
	{
		printf("***************************************\n");
		printf("*[1]  push_back		[2]	 push_fornt   *\n");
		printf("*[3]  showlist		[4]	 pop_back     *\n");
		printf("*[5]  pop_front		[6]	 insert_pos   *\n");
		printf("*[7]  find		 [8]	 length		  *\n");
		printf("*[9]  delete_pos	[10] delete_val	  *\n");
		printf("*[11] sort             [12] resver	  *\n");
		printf("*[13] clear		[14] destroy      *\n");
		printf("*[0]  quit_system			          *\n");
		printf("***************************************\n");
		printf("请选择: >\n");
		scanf("%d",&select);
		if(select==0)
			break;
		switch (select)
		{
		case 1:
			printf("请输入要插入的数据:(-1结束)>");
			while (scanf("%d",&Item),Item!=-1)
			{
				push_back(&mylist,Item);
			}
			show_list(&mylist);
			break;
		case 2:
			printf("请输入要插入的数据:(-1结束)>");
			while (scanf("%d",&Item),Item!=-1)
			{
				push_front(&mylist,Item);
			}
			show_list(&mylist);
			break;
		case 3:
			show_list(&mylist);
			break;
		case 4:
			pop_back(&mylist);
			show_list(&mylist);
			break;
		case 5:
			pop_front(&mylist);
			show_list(&mylist);
			break;
		case 6:
			printf("请输入要插入的数据:>");
			scanf("%d",&Item);
			printf("请输入要插入的位置:>");
			scanf("%d",&pos);
			insert_pos(&mylist,Item,pos);
			break;
		case 7:
			printf("要查找的数据:>");
			scanf("%d",&Item);
			pos=find(&mylist,Item);
			if(pos==-1)
				printf("查找数据%d在顺序表不存在,\n",Item);
			else
				printf("查找的数据%d在顺序表存在下标%d\n",Item,pos);
			break;
		case 8:
			printf("顺序表的长度为> %d\n",length(&mylist));
			break;
		case 9:
			printf("请输入要删除数据的位置:>\n");
			scanf("%d",&pos);
			delete_pos(&mylist,pos-1);
			break;
		case 10:
			printf("请输入要删除数据的值:>\n");
			scanf("%d",&Item);
			delete_val(&mylist,Item);
		case 11:
			sort(&mylist);
			break;
		case 12:
			resver(&mylist);
			break;
		case 13:
			clear(&mylist);
			break;
		case 14:
			destroy(&mylist);
			break;
		default:
		printf("输入的数据有误,请重新输入\n");
			break;
		}
	}
	

	return 0;
}
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值