1. 程式人生 > >資料結構(一):順序表的基本操作 C語言

資料結構(一):順序表的基本操作 C語言

順序表

 

標頭檔案: Sqlist.h

#include<stdio.h>
#include<stdlib.h>

#define SIZE 15
#pragma once
typedef struct Sqlist
{
	int elem[SIZE];
	int usedsize; //有效長度
} Sqlist, *Psqlist;

void InitSqlist(Psqlist List) ;//初始化

bool IsFull(Psqlist List);//判斷是否為滿

bool InsertVal(Psqlist List, int pos,int val);//線上性表中pos位置插入val值

bool DeleteVal(Psqlist List,int pos, int *val);//刪除線性表的pos位置的值,並返回其val值

int FindVal(Psqlist List,int val);//查詢線性表中與val值相同的元素,如果存在返回序號,不存在返回0表示失敗

bool GetVal(Psqlist List,int pos,int*val);//將pos位置的值返回給val

void Clear(Psqlist List);//清空線性表

int GetLength(Psqlist List); //得到線性表長度

void Show(Psqlist List); //列印線性表有效值

 

 

Sqlist.cpp

#include<stdio.h>
#include<assert.h>
#include"Sqlist.h"

void InitSqlist(Psqlist List) 
{
	assert(List!=NULL);
	if(List == NULL)
	{
		return ;
	}
	List->usedsize = 0;
}

bool IsFull(Psqlist List)  //static bool IsFull
{
	assert(List!=NULL);
	if(List->usedsize == SIZE)
	{
		return true;
	}
	else
	{
		return false;
	}
}
/*插入元素*/
/*
1.線性表長度  ,超過陣列長度,丟擲異常 or  動態擴容
2.插入位置不對,丟擲異常
3.將線性表元素從後向前遍歷到pos位置,向後挪一位,將val值插入到Pos位置
*/
bool InsertVal(Psqlist List, int pos,int val)
{
	assert(List!=NULL);
	if(pos>=SIZE)
	{
		printf("The Size Is Not Enough");
		return false;
	}
	for(int i =List->usedsize;i>=pos;i--)
	{
		List->elem[i+1] = List->elem[i];
	}
	List->elem[pos] = val;
	List->usedsize++;  //記得要給usedsize +1!!!
	return true;
}

/*刪除元素*/
bool  DeleteVal(Psqlist List,int pos, int *val) //刪除線性表的pos位置的值,並返回其val值
{
	assert(List!=NULL);
	if(List->elem[pos] == NULL)
	{
		return false;
	}
	else
	{
		*val= List->elem[pos];
		for(int i = pos; i <List->usedsize ;i++)
		{
			List->elem[i] = List->elem[i+1]; 
		}
		List->usedsize --; //記得成功刪除後給usedsize-1
		return true;
	}
}
/*查詢元素*/
int  FindVal(Psqlist List,int val)//查詢線性表中與val值相同的元素,如果存在返回序號,不存在返-1表示失敗
{
	assert(List!=NULL);
	for(int i =0;i<List->usedsize;i++)
	{
		if(List->elem[i] == val)
		{
			return i;
		}
	}
	return -1;
}

/*得到元素*/
bool GetVal(Psqlist List,int pos,int*val)//將pos位置的值返回給val
{
	assert(List!=NULL);
	if(pos>List->usedsize || pos<0)
	{
		return false;
	}
	else
	{
    	*val =List->elem[pos];
		printf("%d",*val); //  之前錯誤:  &val  ,打印出的是地址 ,應該傳遞的是指標直接指向該值  哎呀傻了我!!!記住    		
	}
	return true;
}

void Clear(Psqlist List)//清空線性表
{
	List->usedsize = 0;
}

int  GetLength(Psqlist List) //得到線性表長度
{
	
	assert(List!=NULL);
	return List->usedsize;
}

void Show(Psqlist List) //列印線性表有效值
{
	assert(List!=NULL);
	for(int i= 0;i<List->usedsize;i++)
	{
		printf("%d\n",List->elem[i]);
	}
}

int main()
{
	Sqlist List;
	InitSqlist(&List);
	for(int i =0;i<5;i++)
	{
		InsertVal(&List,i,i);
	}
	 InsertVal(&List,5,9);
	int val ;
   //DeleteVal(&List,2,&val);
	//printf("the deletevalon pos 2  is  %d\n",val);

	//printf("the length of the List is %d\n",GetLength(&List));

	//printf("the val which is same with 9  is on the   pos %d\n",FindVal(&List,9));
	//Show(&List);
	//Clear(&List);
	GetVal(&List,5,&val);
	//printf("the val on the pos 5 is %d",val);
	Show(&List);

	getchar();
	return 0;
}