程式設計語言:C
編譯環境:Dev-C++
題目:設元素值為整型的線性表L,采用順序結構存儲,編寫程式,實作線性表的就地逆置
算法思想:已知表長length,經過length/2次循環,将位序為i(1<=i<=length/2)的資料元素與位序為length+1-i的資料元素互換
怎麼互換?首先利用函數ListDelete删除第i個資料元素,并用e1傳回其值,然後删除第length-i個資料元素,用e2傳回其值,這時表長變為length-2
接着利用函數ListInsert将e2插在第i個元素之前,将e1插在第length+1-i個元素之前
用到的函數有:1.InitList 2.ListInsert 3.ListDelete 4.ListTraverse
源代碼:
//設元素值為整型的線性表L,采用順序結構存儲,編寫程式,實作線性表的就地逆置
//就地逆置舉個例子就是将(1,5,3,7,2,6,9)逆置為(9,6,2,7,3,5,1)
//算法思想:已知表長length,經過length/2次循環,将位序為i(1<=i<=length/2)的資料元素與位序為length+1-i的資料元素互換
// 怎麼互換?首先利用函數ListDelete删除第i個資料元素,并用e1傳回其值,然後删除第length-i個資料元素,用e2傳回其值,這時表長變為length-2
// 接着利用函數ListInsert将e2插在第i個元素之前,将e1插在第length+1-i個元素之前
//用到的函數有:1.InitList 2.ListInsert 3.ListDelete 4.ListTraverse
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//函數結果狀态代碼
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int ElemType;
//線性表的動态配置設定存儲結構
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 5
typedef struct {
ElemType *elem;//數組基址
int length;//目前長度
int listsize;//目前存儲空間
}SqList;
//1.構造一個空的順序表L
Status InitList(SqList *L)
{
(*L).elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!(*L).elem) exit(OVERFLOW);//判斷
(*L).length=0;
(*L).listsize=LIST_INIT_SIZE;
return OK;
}
//2.在L中第i個位置之前插入新的資料元素e,L的長度加1,前提L存在
Status ListInsert(SqList *L,int i,ElemType e)
{
if(i<1||i>(*L).length+1)
return ERROR;
if((*L).length>=(*L).listsize)
{
ElemType *newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
(*L).elem=newbase;
(*L).listsize+=LISTINCREMENT;
}
ElemType *q=(*L).elem+i-1;
ElemType *p=(*L).elem+(*L).length-1;
while(p>=q)
{
*(p+1)=*p;
p--;
}
*q=e;
++(*L).length;
return OK;
}
//3.删除L的第i個資料元素,并用e傳回其值,L的長度減1,前提L存在
Status ListDelete(SqList *L,int i,ElemType *e)
{
if(i<1||i>(*L).length)
return ERROR;
ElemType *q=(*L).elem+i-1;
ElemType *p=(*L).elem+(*L).length-1;
*e=*q;
q++;
while(q<=p)
{
*(q-1)=*q;
q++;
}
--(*L).length;
return OK;
}
//4.順序表的周遊:依次通路表中每一個元素,前提L存在
Status ListTraverse(SqList L)
{
ElemType *p=L.elem;
int i=1;
while(i<=L.length)
{
printf("%d ",*p);
if(i%40==0)
printf("\n");
i++;
p++;
}
printf("\n");
return OK;
}
int main()
{
SqList L;
InitList(&L);
int i,length;
ElemType e1,e2;
printf("該順序表有多少個資料元素?");
scanf("%d",&length);
printf("請輸入%d個資料元素:\n",length);
for(i=1;i<=length;i++)
{
scanf("%d",&e1);
ListInsert(&L,i,e1);
}
printf("原順序表中的元素為:\n");
ListTraverse(L);
for(i=1;i<=length/2;i++)
{
ListDelete(&L,i,&e1);
ListDelete(&L,length-i,&e2);
ListInsert(&L,i,e2);
ListInsert(&L,length+1-i,e1);
}
printf("就地逆置後順序表中的元素為:\n");
ListTraverse(L);
return 0;
}
運作結果:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxUleOVTVE1EeRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLyUzN3QTNzAjMxMjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
又用圓周率小數點後1000位試了一下:
其實還是很有趣的!
有任何建議歡迎底下評論,我會努力改進。