程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 數據結構之線性數組,線性數組

數據結構之線性數組,線性數組

編輯:關於C語言

數據結構之線性數組,線性數組


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
/*
定義一個結構體,包含
保存指向動態數組指針的指針域base,
動態數組的有效長度cent,
動態數組的總長度length
*/
struct Student
{
int* base;
int cent;
int length;
};
//函數的聲明
void init_list(struct Student* str,int len);
bool append_list(struct Student* str,int val);
bool insert_list(struct Student* str,int pos,int val);
bool delete_list(struct Student* str,int pos,int* val);
void show_list(struct Student* str);

int main() {
struct Student str; //定義結構體變量str
int val;
init_list(&str,6); //調用init_list函數,給str中的變量賦值
append_list(&str,10); //為動態數組添加元素
append_list(&str,20);
append_list(&str,30);
append_list(&str,40);
append_list(&str,50);
// append_list(&str,60);
// append_list(&str,70);
printf("線性表:");
show_list(&str); //遍歷線性表
putchar('\n');
if(insert_list(&str,2,5)) //判斷插入元素是否成功,插入成功則輸出線性表,否則輸出插入失敗的原因
{
printf("插入元素後的線性表:");
show_list(&str);
}
putchar('\n');
if(delete_list(&str,2,&val)) //判斷刪除元素是否成功,刪除成功則輸出刪除元素和線性表,否則輸出刪除失敗的原因
{
printf("刪除的元素:%d\n",val);
printf("刪除元素後的線性表:");
show_list(&str);
}
putchar('\n');
return 0;
}

/*
傳入結構體變量的地址和動態數組的長度,
初始化結構體變量str,
str的有效長度賦值為0,str的總長度賦值為len,
str的base指向malloc動態分配的數組
*/
void init_list(struct Student* str,int len)
{
str->base=(int*)malloc(sizeof(int)*len); //動態分配數組
if(str->base==NULL) //判斷內存是否分配成功,失敗則退出
{
printf("內存分配失敗!\n");
exit(-1);
}
str->cent=0;
str->length=len;
}

/*
傳入結構體變量的地址和追加的值,
將val賦值給數組中下標為cent的位置,
然後cent++
*/
bool append_list(struct Student* str,int val)
{
if(str->cent>=str->length) //判斷動態數組中有效長度是否與總長度相等,如果相等,則返回false
{
printf("動態數組空間不足!\n");
return false;
}
str->base[str->cent]=val; //將val追加給數組
str->cent++; //結構體中cent+1
return true;
}

/*
傳入結構體變量的地址,
用for循環遍歷動態數組
*/
void show_list(struct Student* str)
{
if(str->cent<=0) //判斷數組是否為空,如果為空,則不用執行for循環,直接return
{
printf("動態數組為空!\n");
return;
}
for(int i=0;i<str->cent;i++) //用for循環遍歷動態數組
{
printf("%d\t",str->base[i]);
}
putchar('\n');
return;
}

/*
傳入結構體變量的地址、插入的位置和插入的值,
先找到插入的位置pos,將pos後的元素都後退一次,
將val賦值給數組下標為pos-1的位置
然後cent++
*/
bool insert_list(struct Student* str,int pos,int val)
{
if(str->cent>=str->length) //判斷數組是否已滿,如果已滿,則返回false
{
printf("動態數組已滿!\n");
return false;
}
if(pos<1||pos>str->cent) //判斷插入的位置是否合適,如果不合適,則返回false
{
printf("插入位置不合適!\n");
return false;
}
for(int i=str->cent-1;i>=pos-1;i--) //利用for循環,將下表為pos-1後的元素都後移一個位置
{
str->base[i+1]=str->base[i];
}
str->base[pos-1]=val; //將val的值賦值給下標為pos-1的位置
str->cent++;
return true;
}

/*
傳入結構體變量的地址、需要刪除的位置和val的地址,
先找到需要刪除的位置pos,將下標為pos-1的值賦值給*val,
然後將pos後的元素都前進一次,
最後cent--
*/
bool delete_list(struct Student* str,int pos,int* val)
{
if(str->cent<=0) //判斷數組是否為空,如果為空,則直接返回false
{
printf("動態數組為空!\n");
return false;
}
if(pos<1||pos>str->cent) //判斷刪除的位置是否合適,如果不合適,則返回false
{
printf("刪除的元素的位置不存在!\n");
return false;
}
*val=str->base[pos-1]; //將下標為pos-1的值存放在*val中
for(int i=pos;i<str->cent;i++) //用for循環,將下標為pos-1後的元素都前進一次
{
str->base[i-1]=str->base[i];
}
str->cent--;
return true;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved