1. 程式人生 > >資料結構【清華嚴蔚敏】——順序表的基本運算

資料結構【清華嚴蔚敏】——順序表的基本運算

順序表的基本運算如下:   (1)初始化順序表L   (2)依次插入a,b,c,d,e元素   (3)輸出順序表L:a b c d e   (4)順序表L長度:5   (5)順序表L為非空   (6)順序表L的第3個元素:c   (7)元素a的位置:1   (8)在第4個元素位置上插入f元素   (9)輸出順序表L:a b c f d e   (10)刪除L的第3個元素   (11)輸出順序表L:a b f d e   (12)釋放順序表L     

#include <stdio.h> 
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100 	
#define LISTINCREMENT  10 	
typedef char ElemType;	
typedef int Status; 

typedef struct 
{
   ElemType     *elem; 								
   int 			length;		  				
   int 			listsize; 		
} SqList;

// 演算法2.3  初始化 
Status InitList_Sq(SqList &L) 
{  
  L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  if (!L.elem) exit(-1);        // 儲存分配失敗
  L.length = 0;                  
  L.listsize = LIST_INIT_SIZE;   
  return OK;
}

// 演算法2.4  插入 
Status ListInsert_Sq(SqList &L, int i, ElemType e) 
{  
  ElemType *p, *q;
  if (i < 1 || i > L.length+1) 
  {// i的合法值為1≤i≤ListLength_Sq(L)+1
  	return ERROR;  
  }
  
  if (L.length >= L.listsize) {// 當前儲存空間已滿,增加容量
    ElemType *newbase = (ElemType *)realloc(L.elem,
                  (L.listsize+LISTINCREMENT)*sizeof (ElemType));
    if (!newbase) return ERROR;   								
    L.elem = newbase;             							
    L.listsize += LISTINCREMENT;  							
  } 
  q = &(L.elem[i-1]);   							
  for (p = &(L.elem[L.length-1]); p>=q; --p) 
  	*(p+1) = *p;									                              											
  *q = e;      
  ++L.length;   
  return OK;
} 

//演算法2.5 刪除 
Status ListDelete_Sq(SqList &L,int i, ElemType &e)
{
	ElemType *p,*q;
	if(i<1||i>L.length)  return ERROR;
	p=L.elem+i-1; //p=&(L.elem[i-1]);
	e=*p;
	q=L.elem+L.length-1;//最後一個元素的位置
	for(++p;p<=q;p++)
		*(p-1)=*p;
	--L.length;
}

//銷燬順序表操作 
Status DestroyList(SqList &L)
{ 
   free(L.elem);
   L.elem=NULL;
   L.length=0;
   L.listsize=0;
   return OK;

}

Status ListEmpty(SqList L)
{ 
   if(L.length==0)
     return 1;
   else
     return 0;
 
}
 
int	main()
{
	char A[5] = {'a','b','c','d','e'},temp='f';
	//temp用來存放插入的字元以及儲存刪除字元的值 
	int	i;
	
	SqList	List;	
	InitList_Sq(List);
	
	for(i=1; i<=5; i++)
		ListInsert_Sq(List,i,A[i-1]);
		
	if(!ListEmpty(List)) 
		printf("順序表非空\n");
		
	printf("開始時元素序列為:\n");
	for(i=1; i<= List.length; i++)
		printf("%c ", List.elem[i-1]);	
			
	i=4;   //插入位置 
	ListInsert_Sq(List,i,temp);
	printf("\n插入後的元素序列為:\n");
	for(i=1; i<= List.length; i++)
		printf("%c ", List.elem[i-1]);	
    
    i=3;
	ListDelete_Sq(List,i,temp) ;
	printf("\n刪除後的元素序列為:\n");
	for(i=1; i<= List.length; i++)
		printf("%c ", List.elem[i-1]);
	
	if(DestroyList(List)) 
	printf("\n成功釋放順序表L");
			
    getchar();
}