C语言顺序表的代码怎么写

发布时间:2022-10-17 16:08:17 作者:iii
来源:亿速云 阅读:109

今天小编给大家分享一下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语言顺序表的代码怎么写”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

推荐阅读:
  1. 顺序表 C语言
  2. C语言顺序表的实现代码

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:ubuntu修改hostname没用怎么解决

下一篇:C语言入门代码实例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》