数据结构C语言实现线性表(顺序实现)的初始化与基本操作

数据结构 专栏收录该内容
1 篇文章 0 订阅
#include<stdlib.h>  
#include<stdio.h>  
#define LIST_INIT_SIZE 10 /*存储空间初始分配量*/  
#define LISTINCREMENT 10  /*存储空间分配增量*/  
  
typedef struct  sqlist
{  
  int *elem;    /*首地址*/  
  int length;   /*当前长度*/  
  int listsize; /*存储容量*/  
}sqlist;  
  
void initlist(sqlist * v)  
{/*顺序表的初始化算法*/  
  v->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));  //分配内存
  if(!v->elem)  
   {  
    printf("申请空间失败!!!\n");  
    exit(0);  
   }  
  else  
  {  
     v->length=0;  
     v->listsize=LIST_INIT_SIZE;  
  }  
}  
  
void setlist(sqlist* v)  
{/*利用数组建立顺序表*/  
  int y;  
  //sqlist new1;  
  printf("连续输入数据{初存10},当输入0时停止!!!\n");  
  scanf("%d",&y);  
  while(y!=0)  
   {  
     v->elem[v->length]=y;  
     v->length++;  
    if(v->length>=v->listsize)  
     {  
      v->elem=(int *)realloc(v->elem,(v->listsize+LISTINCREMENT)*sizeof(int));  
      if(!v->elem)  
       {  
        printf("存储空间分配失败!!!\n");  
        exit(0);  
       }  
      else  
      {  
        //v->elem=new1.elem;/*原地址指向新分配的地址*/  
        v->listsize=v->listsize+LISTINCREMENT;    
      }  
  
     }  
    
    scanf("%d",&y);  
   }  
}  
  
void printlist(sqlist v)  
{/*利用数组输出顺序表*/  
 int i;  
 printf("输出顺序表:\n");  
 for(i =0;i<v.length;i++)  
  {  
    printf("%d",v.elem[i]);  
    printf("\n");  
  }   
}  
//在顺序表中插入一个元素
int listinsert(sqlist * v, int i, int e){
    int *p; int * q; 
	scanf("%d", &i);
	if(i<1 || i > v->length+1)
		printf("i的值不合法");   //判断i的值是否合法
	if(v->length >= v->listsize)        //判断是否溢出
	{
	    v->elem = (int*)realloc(v->elem, (v->listsize+LISTINCREMENT) * sizeof(int));
		if(!v->elem)
		{
			printf("存储空间分配失败"); 
			exit(0) ;
		}
		else{
			//v->elem = new2.elem;
			v->listsize = v->listsize + LISTINCREMENT;
			}
	}
	q = &(v->elem[i-1]);
	for(p = &(v->elem[v->length-1]); p >= q; --p)
		*(p+1) = *p;
	scanf("%d", &e);
	*q = e;
	++v->length;
	return 0;
}
//删除顺序表中的第i个元素
int listdelete(sqlist * v, int i)
{
  int e;
  printf("请输入要删除第几个元素");
  scanf("%d", &i);
  if(i<1 || i > v->length+1)
		printf("i的值不合法");
  int * p;
  int * q;
  p = &(v->elem[i-1]);//P指向要删除元素的位置
  e = *p;
  q = v->elem + v->length - 1;
  for(++p; p<=q; ++p)
      *(p-1) = *p;
  -- v->length;
  return 0;
}
//查找顺序表中的元素
bool compare(int * q, int a)
	{
		if(*q == a) return true;
		else return false;
	}

int listlocate(sqlist v, int e)
{
	scanf("%d",&e);
	int d = 1;    //用于计数i的位置
	int * p = v.elem;
	while(d <= v.length && !compare(p++, e))
	{
		++d;
	}
	/*if(i <= v.length)*/
	/*{*/
	printf("查找元素的位置为%d\n",d);
	return 0;
/*	}*/
	/*else
		return 0;*/
}

//主函数开始
int main()  
{ 
//建立一个顺序表
 sqlist v;  
 initlist(&v);  
 setlist(&v);  
 printlist(v);  
 printf("\n");
 //插入元素
 printf("现在开始在顺序表中插入一个元素,请先后输入要插入的位置和要插入的整数");
 int i; int e; 
 listinsert(&v,  i,  e);
 printlist(v);  
 printf("\n");
 //删除元素
 listdelete(&v, 3);
 printlist(v);  
 printf("\n"); 
 //查找元素
 int f;
 printf("现在开始查找元素,请输入要查找的元素值");
 listlocate(v, f);
 return 0;  
 
}  

  • 2
    点赞
  • 1
    评论
  • 10
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值