线性表-顺序表相关操作(纯c语言)
1、顺序表的创建并存入数据
#include "stdio.h"
#include "windows.h"
#include "stdlib.h"
#define MAXSIZE 20//顺序表最大长度
/*定义顺序表*/
typedef struct {
int data[MAXSIZE];
int length;
}Sqlist;
/*初始化顺序表*/
void InitList(Sqlist *l){
l->length = 0;
}
/*建立顺序表*/
int CreatList(Sqlist *l, int a[], int n) {
if (n > MAXSIZE)
{
printf("空间不够,无法建立顺序表。\n");
return 0;
}
int k;
for (k = 0; k < n; k++)
{
l->data[k] = a[k];
}
l->length = n;
return 1;
}
/*判空操作*/
int Empty(Sqlist *l){
if (l->length == 0)
return 1;
else
return 0;
}
int main()
{
int a[8] = {1,2,3,4,5,6,7,8};
int i;
Sqlist list1;
InitList(&list1);//初始化顺序表
if (Empty(&list1)){//判空
printf("初始化顺序表成功!\n");
}
printf("给顺序表赋值:1 2 3 4 5 6 7 8\n遍历并输出顺序表:\n");
CreatList(&list1,a,8);//建立一个长度为8的线性表,将数据存进去
/*后续操作*/
for(i = 0;i < list1.length;i++){//循环遍历顺序表,打印
printf("%d\n",list1.data[i]);
}
system("pause");
return 0;
}
2、有序的插入数值
/*寻找要插入的位置*/
int findElem(Sqlist *l,int x){
int j;
for(j = 0;j < l->length;j++){
if(x < l->data[j]){
return j;//找到要插入的位置
}
}
return j;
}
/*插入操作*/
void insertElem(Sqlist *l,int p,int x){
int i;
// p = findElem(&l,x);
for(i = l->length-1;i >= p;--i){
l->data[i+1] = l->data[i];//插入位置后面的元素从后向前依次向后移一个位置
}
l->data[p] = x;
l->length++;//表长加一
}
int main(){
int x = 12;//将12按顺序找到位置并插入进去
int p;
p = findElem(&list1,x);
insertElem(&list1,p,x);
}
3、按元素值查找
int FindElem(Sqlist l,int e){//这里不用引用型 Sqlist *l
int i;
for(i = 0;i < l.length;i++){
if(l.data[i] == e){//元素与数组内的每个元素进行比较
return i;//找到第一个相等的元素,返回下标
}
}
return -1;
}
int main(){
int e = 5;//要查找的值
int j;
j = FindElem(list1,e);
printf("查找到的元素下标为%d\n",j);
}
4、指定位置插入元素
int InsertElem(Sqlist *l,int p,int e){//这里用引用型 Sqlist *l
int i;
if(p < 0||p > l->length||l->length == MAXSIZE){
return 1;
printf("插入位置不合法或顺序表内已经没有位置了\n");
}
for(i = l->length-1;i >= p;i--){
l->data[i+1] = l->data[i];//指定位置后的元素从后往前依次向后移一个位置
l->data[p] = e;//将元素插入到指定位置上
l->length += 1;//表长加一
return 0;
}
int main(){
int p = 4;//指定的位置
int e = 6;//要插入的元素
InsertElem(&list1,p,e);
}
5、删除指定位置上的元素
int DeleteElem(Sqlist *l,int p,int *e){//这里用引用型 Sqlist *l
int i;
if(p<0||p>l->length-1){
printf("指定位置错误");
return 1;
}
*e = l->data[p];//将要删除的元素值赋给e,注意e是一个指针
for(i = p;i < l->length-1;i++){
l->data[i] = l->data[i+1];//从指定位置后一个开始,从前到后元素依次向前移一个
}
l->length -= 1;//表长减一
return 0;
}
int main(){
int p = 4;//指定的位置
int e; //接收删除的元素值
DeleteElem(&list1,p,&e);//使用e的地址
printf("要删除的元素为:%d\n",e);
}
6、求指定位置上的元素
int GetElem(Sqlist l,int p,int *e){//这里不用引用型 Sqlist *l
int i;
if(p<0||p>l.length-1){
printf("指定位置错误");
return 1;
}
*e = l.data[p];//将要删除的元素值赋给e,注意e是一个指针
return 0;
}
int main(){
int p = 4;//指定的位置
int e; //接收该位置上的元素值
GetElem(list1,p,&e);//使用e的地址
printf("下标为4的元素为:%d\n",e);
}