利用順序表的基本操作實作簡單程式
① 定義順序表的存盤結構
② 設計順序表的初始化、插入、洗掉、查找等演算法
③ 撰寫主函式進行測驗。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define LIST_INIT_SIZE 100//順序表存盤空間的初始分配量
#define LISTINCREMENT 10//線性表存盤空間的分配增量
typedef struct{
int *elem;//存盤空間基址
int length;//當前長度
int listsize;//分配存盤容量
}SqList;
int InitList_Sq(SqList&L){
//構造一個空的線性表L
L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
if (!L.elem) exit (1);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return 1;
}
int ListInsert_Sq (SqList&L,int i,int e){
int *newbase;
//在順序線性表的L中的第i個位置插入新的元素e
if(i<1||i>L.length +1 )return 0;//i值不合法
if(L.length>=L.listsize ){ //當前儲存空間已滿,增加分配
newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)exit(1);
L.elem = newbase;
L.listsize +=LISTINCREMENT;
}
int *p;
int *q=&(L.elem [i-1]);
for (p=&(L.elem [L.length -1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length;
return 1;
}
int ListDelete_Sq(SqList &L,int i,int &e)//洗掉第i個位置上的元素,并用e回傳
{
if((i<1)||(i>L.length)) return 0;
int *p=&(L.elem[i-1]);
e=*p;
int *q=L.elem+L.length-1;
for (++p;p<=q;++p)*(p-1)=*p;
--L.length ;
return 1;
}
int LocateElem_Sq(SqList L,int e,int (*compare)(int,int)) //定位滿足compare函式的元素的下標
{
int i=1;
int *p=L.elem;
while(i<=L.length &&!(*compare)(*p++,e)) ++i;
if (i<=L.length) return i;
else return 0;
}
int print(SqList L) //遍歷列印順序表中元素
{for(int i=0;i<L.length ;i++)
printf("%d",L.elem [i]);
printf("\n");
return 0;
}
int main (){
SqList L;//宣告一個順序表
InitList_Sq(L);
int e[10];
printf("請輸入10位數學號:");
for (int i=0;i<10;i++)
{
scanf("%d",&e[i]);
L.elem[i]=e[i];
/*L.elem[i]=i;*/
L.length++;
}
print(L);
ListInsert_Sq (L,2,8); //在第二個位置插入8
print(L);
int g;
ListDelete_Sq(L,2,g); //洗掉第2個位置上的元素 ,e回傳其值
printf("%d\n", g);
print(L);
}
uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define LIST_INIT_SIZE 100//順序表存盤空間的初始分配量
#define LISTINCREMENT 10//線性表存盤空間的分配增量
typedef struct{
int *elem;//存盤空間基址
int length;//當前長度
int listsize;//分配存盤容量
}SqList;
int InitList_Sq(SqList&L)
{
//構造一個空的線性表L
L.elem = (int*)malloc(LIST_INIT_SIZE*sizeof(int));
if (!L.elem)
exit (1);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return 1;
}
int ListInsert_Sq (SqList&L,int i,int e)
{
int *newbase;
//在順序線性表的L中的第i個位置插入新的元素e
if(i<1||i>L.length +1 )
return 0;//i值不合法
if(L.length>=L.listsize ){ //當前儲存空間已滿,增加分配
newbase=(int*)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)exit(1);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
int *p;
int *q=&(L.elem [i-1]);
for (p=&(L.elem [L.length -1]); p >= q; --p)
*(p+1) = *p;
*q=e;
++L.length;
return 1;
}
int ListDelete_Sq(SqList &L,int i,int &e)//洗掉第i個位置上的元素,并用e回傳
{
if((i<1)||(i>L.length))
return 0;
int *p=&(L.elem[i-1]);
e = *p;
int *q = L.elem+L.length-1;
for (++p;p<=q;++p)
*(p-1)=*p;
--L.length ;
return 1;
}
int LocateElem_Sq(SqList L,int e,int (*compare)(int,int)) //定位滿足compare函式的元素的下標
{
int i=1;
int *p=L.elem;
while(i<=L.length &&!(*compare)(*p++,e)) ++i;
if (i<=L.length) return i;
else return 0;
}
int print(SqList L) //遍歷列印順序表中元素
{
for(int i=0;i<L.length ;i++)
printf("%d ", L.elem [i]);
printf("\n");
return 0;
}
int main (){
SqList L;//宣告一個順序表
InitList_Sq(L);
//int e[10];
int e;
printf("請輸入10位數學號:");
for (int i=0;i<10;i++)
{
//scanf("%d",&e[i]);
scanf("%d",&e);
#if 0
L.elem[i] = e;
/*L.elem[i]=i;*/
L.length++;
#else
ListInsert_Sq(L, i+1, e);
#endif
}
print(L);
ListInsert_Sq (L,L.length+1,8); //在第二個位置插入8
//ListInsert_Sq (L,2,8); //在第二個位置插入8
print(L);
int g;
//ListDelete_Sq(L,2,g); //洗掉第2個位置上的元素 ,e回傳其值
if (ListDelete_Sq(L, L.length,g)) //洗掉第2個位置上的元素 ,e回傳其值
printf("%d\n", g);
print(L);
}
做了部分修改,供參考~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/169711.html
標籤:C語言
上一篇:為什么我的冒泡排不了序啊
下一篇:「面試」拿到小紅書的意向書
