今天小编给大家分享一下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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。