1. 程式人生 > >資料結構2-動態生成順序表的例項與分析

資料結構2-動態生成順序表的例項與分析

動態建立一個順序表,並完成插入和刪除的操作。程式碼如下:

#include"stdio.h"
#include"conio.h"
#define MaxSize 10
typedef int ElemType;/*將int定義為ElemType*/

typedef struct{
	int *elem;
	int length;
	int listsize;
}Sqlist;

/** 初始化一個順序表 */
/** 引數L:Sqlist型別的指標 */
void initSqlist(Sqlist *L){
	L->elem=(int *)malloc(MaxSize*sizeof(ElemType));
	if(!L->elem)
		exit(0);
	L->length=0;
	L->listsize=MaxSize;
}

/** 向順序表中插入元素 */
/** 引數L:Sqlist型別的指標 */
/** 引數i:插入元素的位置 */
/** 引數item:插入的元素 */
void InsertElem(Sqlist *L,int i,ElemType item){
	/* 向順序表L中第i個位置上插入元素item */
	ElemType *base,* insertPtr,*p;
	if(i<1 || i>L->length+1)
		exit(0);
	if(L->length>=L->listsize){
		base=(ElemType *)realloc(L->elem,(L->listsize+10)*sizeof(ElemType));
		L->elem=base;
		L->listsize=L->listsize+100;
	}
	insertPtr=&(L->elem[i-1]);
	for(p=&(L->elem[L->length-1]);p>=insertPtr;p--)
		*(p+1)=*p;
	*insertPtr=item;
	L->length++;
}
/** 向順序表中刪除元素 */
/** 引數L:Sqlist型別的指標 */
/** 引數i:刪除元素的位置 */
void DelElem(Sqlist *L,int i){
	/* 從順序表L中刪除第i個元素 */
	ElemType *delItem,*q;
	if(i<1 || i>=L->length+1)
		exit(0);
	delItem=&(L->elem[i-1]);
	q=L->elem+L->length-1;
	for(++delItem;delItem<=q;++delItem)
		*(delItem-1)=*delItem;
	L->length--;
}

/* 測試函式 */
main(){

	Sqlist l;
	int i;
	initSqlist(&l);
	for(i=0;i<15;i++)
		InsertElem(&l,i+1,i+1);
	printf("\nThe content of the list is\n");
	for(i=0;i<l.length;i++)
		printf("%d ",l.elem[i]);
	DelElem(&l,5);
	printf("\nDelete the fifth element\n");
	for(i=0;i<l.length;i++)
		printf("%d ",l.elem[i]);
	system("pause");
	exit(0);
}

例項的分析與說明:

1.本程式雖然是動態生成,但是本質上還是一個順序表,也就是它在本質上是一個數組,所以陣列的特性它都有,可以隨機訪問。

2.q=L->elem+L->length-1;語句的解釋:q指向的是順序表的最後一個元素,由於q是一個指標而不是一個元素,所以它指向的是地址,那麼就需要基地址+順序表長度,就是最後一個元素的地址了。