今天小编给大家分享一下C语言顺序表的代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
sqlist.h
//#pragma once
//#define N 1000
//typedef int SeqListDataType;
//
//静态顺序表,太死了 满了就插不进去了,空间太大用不完就会浪费
//typedef struct SeqList
//{
// SeqListDataType a[N];
// int size;//表示数组中存了多少个数据
//}SeqList;
//
//void SeqListInit(SeqList* ps);
//void SeqListPushBack(struct SeqList*pc,SeqListDataType x );
//void SeqListPopBack(SeqList* ps);
//void SeqListPushFront(struct SeqList*pc,SeqListDataType x );
//void SeqListPopFront(SeqList* ps);
//动态顺序表
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SeqListDataType;
typedef struct SeqList//凡是多个数据的存储上我们之前学的结构体
{
SeqListDataType* a;
int size;//表示数组中已经存了多少个数据
int capacity;//数组能存实际空间容量有多大,数据个数,单位个数, 可以方便写扩容函数
}SeqList;//固定格式 ,通过结构体建立一个顺序表
//接口函数,定义一些函数 增删查改
//命名风格跟着STL走 STL是C++的一个库
void SeqListInit(SeqList* ps);//初始化
void SeqListPushBack(struct SeqList*ps,SeqListDataType x );//尾插
void SeqListPopBack(SeqList* ps);//尾删
void SeqListPushFront(struct SeqList*ps,SeqListDataType x );//头插
void SeqListPopFront(SeqList* ps);//头删
void SeqListPrint(SeqList* ps);
void SeqListDestory(SeqList* ps);
int SeqListFind(SeqList* ps,SeqListDataType x); //找到返回下标,没找到返回-1
void SeqListInsert(SeqList* ps,int pos,SeqListDataType x); //在pos 下标位置插入
void SeqListDelete(SeqList* ps,int pos);//在pos 下标位置删除
sqlist.c
#include "Seqlist.h"
#include "assert.h"
//函数传参,形参是是实参的拷贝,形参的改变不会影响实参,然后通过地址对结构体里面的内容做修改,所以PS这个可以换成任意字母,这只是一个符号
//(1)& 运算符 :用于取一个对象的地址
//(2)* 运算符:作用于指针时表示访问指针所指向的对象
void SeqListInit(SeqList* ps)//线性表初始化函数
{
ps->a=NULL;
ps->capacity=0;
ps->size=0;
}
void SeqListPushBack(struct SeqList*ps,SeqListDataType x )//尾插
{
if(ps->size==ps->capacity)//扩容开始
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;//如果是0就给4,如果不是0,就给2倍
SeqListDataType*tmp=(SeqListDataType*)realloc(ps->a,newcapacity*sizeof(SeqListDataType));//realloc对原有的空间扩容,如果原来的空间是空,则功能和mealloc相同
if(tmp==NULL)
{
printf("realloc fail\n");
exit(-1);//直接终止程序
}
ps->a=tmp;
ps->capacity=newcapacity;
}//扩容结束
ps->a[ps->size]=x;//数据的size从0开始,所以此时是size-1,正好现在还有空间,直接将x放到数组里面,数组的位置是在ps->size这里。
ps->size=ps->size+1;
}
void SeqListPrint(SeqList* ps)
{
int i=0;
for(i=0;i<ps->size;i=i+1)
{
printf("%d ",ps->a[i]);
}
printf("\n");
}
void SeqListDestory(SeqList* ps)
{
free(ps->a);
ps->a=NULL;
ps->capacity=0;
ps->size=0;
}
//这里有一个问题,如果只插入两个数,但删除3个数的时候,编译器没法识别出来,没法报错,所以不能直接ps->size--,我们需要用如下的方法
void SeqListPopBack(SeqList* ps)//从线性表后面删除元素
{
if(ps->size>0)
{
ps->a[ps->size-1]=0;
ps->size=ps->size-1;
}
/*assert(pd->size >0);断言,断言是如果括号后面条件为真则没事,否则则条件为假
ps->size--;*/
}
void SeqListPushFront(struct SeqList*ps,SeqListDataType x )//头插,要考虑扩容的问题,数据的要从最后一个开始往后挪size+1
{
//int end=ps->size-1;//下标是最后一个数的下一个位置
//if(ps->size==ps->capacity)
//{
// int newcapacity=ps->capacity==0?4:ps->capacity*2;
// SeqListDataType*tmp=(SeqListDataType*)realloc(ps->a,newcapacity*sizeof(SeqListDataType));
// if(tmp==NULL)
// {
// printf("realloc fail\n");
// exit(-1);//直接终止程序
// }
// ps->a=tmp;
// ps->capacity=newcapacity;
/*}*/
SeqListInsert(ps,0, x);//改进 服用了下标插入函数
//挪动数据
/*while(end>=0)
{
ps->a[end+1]=ps->a[end];
--end;
}
ps->a[0]=x;
ps->size++;*/
}
void SeqListPopFront(SeqList* ps)//头删
{
int begin=1;
assert(ps->size>0);
while(begin<ps->size)
{
ps->a[begin-1]=ps->a[begin];
++begin;
}
}
int SeqListFind(SeqList* ps,SeqListDataType x)//找到返回下标,没找到返回-1
{
int i=0;
for(i=0;i<=ps->size;i++)
{
if(ps->a[i]==x)
{
return i;
}
}
return -1;
}
void SeqListInsert(SeqList* ps,int pos,SeqListDataType x)//在pos 下标位置插入
{
int end=0;
/*if(pos>ps->size || pos<0)
{
printf("pos invalid\n");
return;
}*/
assert(pos>=0 && pos<=ps->size);
if(ps->size==ps->capacity)//扩容开始
{
int newcapacity=ps->capacity==0?4:ps->capacity*2;//如果是0就给4,如果不是0,就给2倍
SeqListDataType*tmp=(SeqListDataType*)realloc(ps->a,newcapacity*sizeof(SeqListDataType));//realloc对原有的空间扩容,如果原来的空间是空,则功能和mealloc相同
if(tmp==NULL)
{
printf("realloc fail\n");
exit(-1);//直接终止程序
}
ps->a=tmp;
ps->capacity=newcapacity;
}//扩容结束
end=ps->size-1;
//挪动数据
while(end>=pos)
{
ps->a[end+1]=ps->a[end];
--end;
}
ps->a[pos]=x;
ps->size ++;
}
void SeqListDelete(SeqList* ps,int pos)
{
int begin=0;
assert(pos>=0 && pos<=ps->size);
begin=pos+1;
while(begin<ps->size)
{
ps->a[begin-1]=ps->a[begin];
++begin;
}
ps->size++;
}
test.c
#include "Seqlist.h"
#include "assert.h"
//void TestSeqList1()
//{
// SeqList S1;
// SeqListInit(&S1);
// SeqListPushBack(&S1,1);
// SeqListPushBack(&S1,2);
// SeqListPushBack(&S1,3);
// SeqListPushBack(&S1,4);
// SeqListPushBack(&S1,5);
// SeqListPushBack(&S1,6);
// SeqListPrint(&S1);
//
//
// SeqListPushFront(&S1,20);//头插
// SeqListPrint(&S1);
//
// SeqListPopFront(&S1);
// SeqListPrint(&S1);
//
//
// SeqListPopFront(&S1);
// SeqListPrint(&S1);
//
// SeqListDestory(&S1);
//}
//
//void TestSeqList2()
//{
// int pos=0;
// SeqList S2;
// SeqListInit(&S2);
// SeqListPushBack(&S2,1);
// SeqListPushBack(&S2,2);
// SeqListPushBack(&S2,3);
// SeqListPushBack(&S2,4);
// SeqListPushBack(&S2,5);
// SeqListPushBack(&S2,6);
// SeqListPrint(&S2);
// SeqListInsert(&S2,2,200);
// SeqListPrint(&S2);
//
// pos=SeqListFind(&S2,4);
// if(pos!=-1)
// {
// SeqListInsert(&S2,5,700);
//
// }
//
// SeqListPushFront(&S2,-1 );
// SeqListPrint(&S2);
// SeqListDelete(&S2,3);
// SeqListPrint(&S2);
// SeqListDestory(&S2);
//}
void menu()
{
printf("*****************************************\n");
printf("请输入值:\n");
printf("1、头插 2、尾插 \n ");
printf("1、头删 2、尾删 \n ");
printf("*****************************************\n");
}
int main()
{
int i=0;
/*TestSeqList1();*/
/*TestSeqList2();*/
while(i!=-1)
{
SeqList S1;
SeqListInit(&S1);
SeqListPushBack(&S1,1);
SeqListPushBack(&S1,2);
SeqListPushBack(&S1,3);
SeqListPushBack(&S1,4);
SeqListPrint(&S1);
menu();
scanf("%d",&i);
switch(i)
{
case 1:
SeqListPushFront(&S1,20);
SeqListPrint(&S1);
break;
case 2:
SeqListPushBack(&S1,1);
SeqListPrint(&S1);
break;
case 3:
SeqListPopFront(&S1);
SeqListPrint(&S1);
break;
case 4:
SeqListPopBack(&S1);
SeqListPrint(&S1);
break;
}
}
/*if(i=1)
{
SeqListPushFront(&S1,20);
SeqListPrint(&S1);
}
else if(i=2)
{
SeqListPushBack(&S1,1);
SeqListPrint(&S1);
}
else if(i=3)
{
SeqListPopFront(&S1);
SeqListPrint(&S1);
}
else if(i=4)
{
SeqListPopBack(&S1);
SeqListPrint(&S1);
}*/
return 0;
}
以上就是“C语言顺序表的代码怎么写”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。