天天看點

線性表練習----線性表的就地逆置

程式設計語言: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;
}
           

運作結果:

線性表練習----線性表的就地逆置

又用圓周率小數點後1000位試了一下:

線性表練習----線性表的就地逆置
線性表練習----線性表的就地逆置
線性表練習----線性表的就地逆置

其實還是很有趣的!

有任何建議歡迎底下評論,我會努力改進。

繼續閱讀