C语言顺序表的基本操作

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>//调用exit();函数
#define N 10
typedef struct List
{
int a[N];
int last;//相当于就是伪指针。用来表示有效数组的下标
} NODE,*Node;
//函数声明;
Node create_list();//创建顺序表。
void traverse_list(Node);//遍历顺序表
void search_list(Node,int);//查找
void insert_list(Node,int,int);//插入
void delete_list(Node,int,int*);//将删除的值输出来。只能指针改变自己的值
void sort_list(Node);//排序顺序表
/*int Is_Full(Node);
int Is_Empty(Node);*/


int main(void)
{
Node Head;//定义结构体指针,用来存放数组的首地址
int postion,val,val1,postion1,*val2;
Head=create_list();
traverse_list(Head);
/*printf("请输入你要查找的值:");//没有按位置查找
scanf("%d",&val);
search_list(Head,val);
printf("请输入你要插入的位置:");
scanf("%d",&postion);
printf("请输入你要插入的值:");
scanf("%d",&val1);
insert_list(Head,postion,val1);
traverse_list(Head);*/
/*printf("请输入你要删除的位置:");
scanf("%d",&postion1);
delete_list(Head,postion1,val2);


traverse_list(Head);*/
printf("排序后的顺序表为:");
sort_list(Head);
traverse_list(Head);
return 0;


}
Node create_list()//将初始话顺序表的同时创建
{
Node p;
int n,i,val;
p=(Node)malloc(sizeof(NODE));
if(p==NULL)
{

printf("动态内存分配失败!\n");
exit(-1);//终止程序。
}
  p->last=0;//初始化。
  printf("请输入你要顺序表的值的个数");
scanf("%d",&n);
if(n>N)
printf("个数太大,请重新分配数组的大小!\n");
else{


for(i=0;i<n;++i)
{
printf("请输入第%d个值:",i+1);
scanf("%d",&val);
p->a[p->last++]=val;

//这步就相当于每次移向下一个坐标
}
}
p->last--;
printf("最后一个元素下标为%d\n",p->last);
return p;
}
void traverse_list(Node p)
{
int i=0;
for(i=0;i<=p->last;i++)
printf("%3d",p->a[i]);

printf("\n");
return ;
}
void search_list(Node p,int val)
{
int i;
for(i=0;i<=p->last;i++)//此时我用的下标。也可以用顺序表的长度遍历查找
if(p->a[i]==val)
break;
if(i>p->last)
printf("不能找到这个值\n");
return ;

}
void insert_list(Node p,int postion,int val1)//首先要判断是否表满
{ //判断插入的位置是否合法
int i; //然后就插入
if(p->last+1==N) //
printf("表满了!\n");
if(postion<1||postion>p->last+2)//是比表长的1大,失败
printf("插入位置不合法\n");

else
{
for(i=p->last;i>=postion-1;i--)//2
p->a[i+1]=p->a[i];
}
p->a[postion-1]=val1;
p->last++;//插入后表长加1
return ;
}
void delete_list(Node p,int postion,int* val)//判断是否表空。
{ //判断删除的位置合法?
int i;
if(p->last==-1)
printf("表空!\n");
if(postion>p->last+1||postion<1)
printf("删除位置不合法~!\n");
else 
{
for(i=postion;i<=p->last;i++)//
{
p->a[i-1]=p->a[i];
}
p->last--;
}
return ;
}
void sort_list(Node p)
{

int i,j,t;
// printf("lalala%d",p->last);
for(i=0;i<p->last;i++)
for(j=i;j<p->last+1;j++)
if(p->a[i]>p->a[j])
{
t=p->a[i];
p->a[i]=p->a[j];
p->a[j]=t;
}
return ;
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值