您好,登錄后才能下訂單哦!
今天小編給大家分享一下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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。