C語(yǔ)言順序表的實(shí)現(xiàn)代碼
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)順序表的具體代碼,供大家參考,具體內(nèi)容如下
seqlist.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<cstdio>
#include<malloc.h>
#include<assert.h>
#define SEQLIST_INIT_SIZE 8
#define INC_SIZE 3 //空間增量的大小
typedef int ElemType;
typedef struct Seqlist {
ElemType *base;
int capacity; //順序表容量
int size; //表的大小
}Seqlist;
bool Inc(Seqlist *list);//增加順序表的容量
void InitSeqlist(Seqlist *list); //初始化順序表
void push_back(Seqlist *list, ElemType x); //在順序表的末尾插入元素
void push_front(Seqlist *list, ElemType x); //在順序表的頭部插入元素
void show_list(Seqlist *list); //顯示順序表中的元素
void pop_back(Seqlist *list); //刪除順序表最后一個(gè)元素
void pop_front(Seqlist *list); //刪除順序表第一個(gè)元素
void insert_pos(Seqlist *list, int pos, ElemType x);//在順序表的選定位置上插入數(shù)據(jù)
int find(Seqlist *list, ElemType key); //在順序表中查找元素key的下標(biāo)
int length(Seqlist *list);//求順序表的長(zhǎng)度
void delete_pos(Seqlist *list, int pos); //刪除順序表中特定位置的數(shù)據(jù)元素
void delete_val(Seqlist *list, int key);//刪除順序表中值為key的數(shù)據(jù)元素
void sort(Seqlist *list);//冒泡排序
void reverse(Seqlist *list);//逆置順序列表
void clear(Seqlist *list);//清除順序表中的所有元素
void destroy(Seqlist *list);//摧毀順序表
void merge(Seqlist *lt, Seqlist *la, Seqlist *lb);//合并兩個(gè)順序列表
#endif //__SEQLIST_H__
seqlist.cpp
#include"seqlist.h"
bool Inc(Seqlist *list) {
ElemType *newbase = (ElemType*)realloc(list, sizeof(ElemType)*(list->capacity + INC_SIZE)); //重新分配內(nèi)存空間
if (newbase == NULL) {
printf("內(nèi)存空間已滿,無(wú)法再分配內(nèi)存空間!\n");
return false;
}
list->base = newbase;
list->capacity += INC_SIZE;
return true;
}
void InitSeqlist(Seqlist *list) {
list->base = (ElemType*)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
assert(list->base != NULL);
list->capacity = SEQLIST_INIT_SIZE;
list->size = 0;
}
void push_back(Seqlist *list, ElemType x) {
if (list->size >= list->capacity && !Inc(list)) { //Inc(list)用來(lái)判斷增加順序表容量是否成功,只有在失敗的情況下才會(huì)進(jìn)入if語(yǔ)句中
printf("順序表容量已滿,無(wú)法再在表尾繼續(xù)插入新元素!\n");
return;
}
list->base[list->size] = x;
list->size++;
}
void push_front(Seqlist *list, ElemType x) {
if (list->size >= list->capacity && !Inc(list)) {
printf("順序表容量已滿,無(wú)法再在表頭插入新元素!\n");
return;
}
for (int i = list->size;i > 0;i--) {
list->base[i] = list->base[i - 1];
}
list->base[0] = x;
list->size++;
}
void show_list(Seqlist *list) {
for (int i = 0;i < list->size;i++) {
printf("%d ", list->base[i]);
}
printf("\n");
}
void pop_back(Seqlist *list) {
if (list->size == 0) {
printf("順序表已空,無(wú)法再在表尾刪除元素!\n");
return;
}
list->size--;
}
void pop_front(Seqlist *list) {
if (list->size == 0) {
printf("順序表已空,無(wú)法再在表頭刪除元素!\n");
return;
}
for (int i = 0;i < list->size - 1;i++) {
list->base[i] = list->base[i + 1];
}
list->size--;
}
void insert_pos(Seqlist *list, int pos, ElemType x) {
if (pos<0 || pos>list->size) {
printf("插入位置不合法,無(wú)法插入元素!\n");
return;
}
if (list->size >= list->capacity && !Inc(list)) {
printf("順序表容量已滿,無(wú)法在插入新的元素!\n");
return;
}
for (int i = list->size;i > pos;i--) {
list->base[i] = list->base[i - 1];
}
list->base[pos] = x;
list->size++;
}
int find(Seqlist *list, ElemType key) {
for (int i = 0;i < list->size;i++) {
if (list->base[i] == key)
return i;
}
return -1;
}
int length(Seqlist *list) {
return list->size;
}
void delete_pos(Seqlist *list, int pos) {
if (pos < 0 || pos >= list->size) {
printf("刪除位置不合法,無(wú)法刪除元素!\n");
return;
}
for (int i = pos;i < list->size - 1;i++) {
list->base[i] = list->base[i + 1];
}
list->size--;
}
void delete_val(Seqlist *list, int key) {
int pos = find(list, key);
if (pos == -1) {
printf("順序表中沒(méi)有這個(gè)元素!\n");
return;
}
delete_pos(list, pos);
}
void sort(Seqlist *list) {
for (int i = 0;i < list->size - 1;i++) {//排序的趟數(shù)(例如5個(gè)數(shù)據(jù)需要比較4趟)
for (int j = 0;j < list->size - 1 - i;j++) {//每一趟比較中的比較次數(shù)(例如5個(gè)數(shù)據(jù)在第0趟需要比較4次)
if (list->base[j] > list->base[j + 1]) {
ElemType temp = list->base[j];
list->base[j] = list->base[j + 1];
list->base[j + 1] = temp;
}
}
}
}
void reverse(Seqlist *list) {
if (list->size == 0 || list->size == 1) return;
int low = 0, high = list->size - 1;
while (low < high) {
ElemType temp = list->base[low];
list->base[low] = list->base[high];
list->base[high] = temp;
low++;
high--;
}
}
void clear(Seqlist *list) {
list->size = 0;
}
void destroy(Seqlist *list) {
free(list->base);
list->base = NULL;
list->capacity = 0;
list->size = 0;
}
void merge(Seqlist *lt, Seqlist *la, Seqlist *lb) {
lt->capacity = la->size + lb->size;
lt->base = (ElemType*)malloc(sizeof(ElemType)*lt->capacity);
assert(lt->base != NULL);
int ia = 0, ib = 0, ic = 0;
while (ia < la->size&&ib < lb->size) {
if (la->base[ia] < lb->base[ib]) {
lt->base[ic++] = la->base[ia++];
}
else {
lt->base[ic++] = lb->base[ib++];
}
}
while (ia < la->size) {
lt->base[ic++] = la->base[ia++];
}
while (ib < lb->size) {
lt->base[ic++] = lb->base[ib++];
}
lt->size = la->size + lb->size;
show_list(lt);
}
main.cpp
#include"seqlist.h"
void main() {
Seqlist list;
InitSeqlist(&list);
ElemType item;
int pos;
int select = 1;
while (select) {
printf("*******************************************\n");
printf("*[1] push_back [2] push_front *\n");
printf("*[3] show_list [4] pop_back *\n");
printf("*[5] pop_front [6] insert_pos *\n");
printf("*[7] find [8] length *\n");
printf("*[9] delete_pos [10] delete_value *\n");
printf("*[11] sort [12] reverse *\n");
printf("*[13] clear [14] merge *\n");
printf("*[0] quit_system *\n");
printf("*******************************************\n");
printf("請(qǐng)選擇:>>");
scanf("%d", &select);
if (select == 0) break;
switch (select) {
case 1:
printf("請(qǐng)輸入要插入的數(shù)據(jù)(-1結(jié)束):>");
while (scanf("%d", &item), item != -1) {//先輸入item的值,只要item不等于-1就接著循環(huán)
push_back(&list, item);
}
break;
case 2:
printf("請(qǐng)輸入要插入的數(shù)據(jù)(-1結(jié)束):>");
while (scanf("%d", &item), item != -1) {
push_front(&list, item);
}
break;
case 3:
show_list(&list);
break;
case 4:
pop_back(&list);
break;
case 5:
pop_front(&list);
break;
case 6:
printf("請(qǐng)輸入要插入的數(shù)據(jù):>");
scanf("%d", &item);
printf("請(qǐng)輸入要插入的位置:>");
scanf("%d", &pos);
insert_pos(&list, pos, item);
break;
case 7:
printf("請(qǐng)輸入要查找的數(shù)據(jù):>");
scanf("%d", &item);
pos = find(&list, item);
if (pos == -1)
printf("查找的數(shù)據(jù)元素不在順序表中!\n");
else
printf("查找的數(shù)據(jù)元素在順序表中的下標(biāo)位置為%d\n", pos);
break;
case 8:
printf("順序表的長(zhǎng)度為%d\n", length(&list));
break;
case 9:
printf("請(qǐng)輸入要?jiǎng)h除數(shù)據(jù)在順序表中的下標(biāo)位置:>");
scanf("%d", &pos);
delete_pos(&list, pos);
break;
case 10:
printf("請(qǐng)輸入要?jiǎng)h除數(shù)據(jù)的值:>");
scanf("%d", &item);
delete_val(&list, item);
break;
case 11:
sort(&list);
break;
case 12:
reverse(&list);
break;
case 13:
clear(&list);
break;
case 14:
Seqlist mylist, yourlist;
ElemType item1, item2;
InitSeqlist(&mylist);
InitSeqlist(&yourlist);
printf("請(qǐng)輸入順序表1中的元素值(-1結(jié)束):>");
while (scanf("%d", &item1), item1 != -1) {
push_back(&mylist, item1);
}
printf("請(qǐng)輸入順序表2中的元素值(-1結(jié)束):>");
while (scanf("%d", &item2), item2 != -1) {
push_back(&yourlist, item2);
}
merge(&list, &mylist, &yourlist);
destroy(&mylist);
destroy(&yourlist);
break;
default:
printf("輸入的選擇錯(cuò)誤!請(qǐng)重新輸入!\n");
break;
}
}
destroy(&list);
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組模擬實(shí)現(xiàn)順序表流程詳解
- C語(yǔ)言實(shí)現(xiàn)順序表的基本操作指南(注釋很詳細(xì))
- 新手向超詳細(xì)的C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)順序表
- C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)順序表詳解
- C語(yǔ)言實(shí)現(xiàn)的順序表功能完整實(shí)例
- C語(yǔ)言使用順序表實(shí)現(xiàn)電話本功能
- C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)順序表的實(shí)現(xiàn)代碼
- C語(yǔ)言?超詳細(xì)順序表的模擬實(shí)現(xiàn)實(shí)例建議收藏
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(123.買股票的最佳時(shí)間之三)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(123.買股票的最佳時(shí)間之三),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++ TensorflowLite模型驗(yàn)證的過(guò)程詳解
這篇文章給大家介紹了C++ TensorflowLite模型驗(yàn)證的過(guò)程,測(cè)試代碼,主要是RunInference()和read_file(),詳細(xì)操作過(guò)程跟隨小編一起看看吧2021-08-08
在Visual Studio Code中使用CSSComb格式化CSS文件的教程
這篇文章主要介紹了在Visual Studio Code中使用CSSComb格式化CSS文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
C語(yǔ)言陷阱與缺陷之?dāng)?shù)組越界訪問(wèn)詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的數(shù)組越界訪問(wèn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
數(shù)據(jù)結(jié)構(gòu)之帶頭結(jié)點(diǎn)的單鏈表
單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。鏈表中的數(shù)據(jù)是以結(jié)點(diǎn)來(lái)表示的,每個(gè)結(jié)點(diǎn)的構(gòu)成:數(shù)據(jù)域(數(shù)據(jù)元素的映象)?+?指針域(指示后繼元素存儲(chǔ)位置),元素就是存儲(chǔ)數(shù)據(jù)的存儲(chǔ)單元,指針就是連接每個(gè)結(jié)點(diǎn)的地址數(shù)據(jù)2023-07-07
C++ Leetcode實(shí)現(xiàn)從英文中重建數(shù)字
本文主要介紹了當(dāng)給你一個(gè)字符串s,其中包含字母順序打亂的用英文單詞表示的若干數(shù)字(0-9)時(shí),如何通過(guò)Leetcode按升序返回原始的數(shù)字。感興趣的童鞋可以來(lái)看看2021-11-11

