本篇文章主要針對(duì)《數(shù)據(jù)結(jié)構(gòu)》中的順序表的增刪查改以及一些常用算法進(jìn)行詳盡的代碼描述。本代碼使用c語言書寫敌蚜,并且通過測(cè)試桥滨。可以直接拷貝編譯钝侠,在你的main函數(shù)中進(jìn)行測(cè)試该园。
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50 //順序表的表長(zhǎng)
#define InitSize 100 //順序表的初始表長(zhǎng)
typedef struct {
int data[MaxSize]; //順序表的元素
int length; //順序表的長(zhǎng)度
}SqList; //順序表的類型定義
typedef struct{
int *data; //指示動(dòng)態(tài)分配的數(shù)組指針
int dataSize,length; //數(shù)組的最大容量和當(dāng)前儲(chǔ)存元素的個(gè)數(shù)
}mSqList;
/*
* [InitList 順序表初始化函數(shù)]
* @param L [傳入需要初始化的順序表]
* @return [成功初始化返回 1]
*/
int InitList(mSqList *L,int size){
for (int i = 0; i < size; i++) {
L->data[i] = rand()%1000;
}
L->dataSize = InitSize;
L->length = size;
return 1;
}
/**
* [Length 計(jì)算表長(zhǎng)]
* @param L [傳入需要計(jì)算長(zhǎng)度的順序表]
* @return [返回表長(zhǎng)]
*/
int Length(mSqList L){
return L.length;
}
/**
* [LocateElem 查找元素e所在的位置]
* @param L [傳入需要查找的順序表]
* @param e [需要查找的元素e]
* @return [成功查找返回元素的位置,查找失敗返回-1]
*/
int LocateElem(mSqList L,int e){
for(int i = 0; i < L.length; i++)
{
if(L.data[i] == e)
{
return i+1;
}
}
return -1;
}
/**
* [GetElem 按位置查找元素]
* @param L [傳入需要查找的順序表]
* @param position [傳入需要查找的位置position]
* @return [查找成功返回查找元素帅韧,查找失敗返回-1]
*/
int GetElem(mSqList L,int position){
if (position <= 0 || position > L.length)
{
return -1;
}
return L.data[position - 1];
}
/**
* [ListInsert 向線性表對(duì)應(yīng)位置i插入元素e]
* @param L [需要插入的順序表]
* @param i [元素插入的位置]
* @param e [插入的元素]
* @return [成功返回 1里初,插入失敗返回-1]
*/
int ListInsert(mSqList *L,int i,int e){
if (i < 1 | i > L->length + 1)
{
return -1;
}
if (L->length >= L->dataSize)
{
return -1;
}
for (int j = L->length; j >= i; j--)
{
L->data[j] = L->data[j-1];
}
L->data[i-1] = e;
L->length++;
return 1;
}
/**
* [ListDelete 刪除順序表中位置i的元素]
* @param L [待刪除的順序表]
* @param i [待刪除元素的位置]
* @return [成功返回刪除元素的值 e,失敗返回 -1]
*/
int ListDelete(mSqList *L,int i)
{
int e = 0;
if (i < 1 || i > L->length)
{
return -1;
}
e = L->data[i-1];
for (int j = i; j < L->length; j++)
{
L->data[j-1] = L->data[j];
}
L->length--;
return e;
}
/**
* [ListMinDelete 刪除順序表中最小的元素]
* @param L [待刪除的順序表]
* @return [成功返回刪除的元素 e忽舟,失敗返回 -1]
*/
int ListMinDelete(mSqList *L)
{
int tmp = L->data[0];
int position = 0;
if(L->length < 1)
{
return -1;
}
for (int i = 0; i < L->length; i++)
{
if(tmp > L->data[i])
{
tmp = L->data[i];
position = i;
}
}
L->data[position] = L->data[L->length-1];
L->length--;
return tmp;
}
/**
* [ListReverse 將順序表原地逆置]
* @param L [需要逆置的順序表]
* @return [成功返回 1双妨,失敗返回 -1]
*/
int ListReverse(mSqList *L)
{
int tmp = 0;
if(L->length <= 0)
{
return -1;
}
for(int i = 0; i < L->length / 2; i++)
{
tmp = L->data[i];
L->data[i] = L->data[L->length - i - 1];
L->data[L->length - i - 1] = tmp;
}
return 1;
}
/**
* [ListElemDelete 刪除順序表中所有相同的元素]
* @param L [待刪除的順序表]
* @param x [待刪除的元素 x]
* @return [成功刪除反回刪除后順序表的長(zhǎng)度 length,失敗則返回 -1]
*/
int ListElemDelete(mSqList *L,int x)
{
int k = 0;
int delNUm = 0;
if(L->length <= 0)
{
return -1;
}
for (int i = 0; i < L->length; i++)
{
if(L->data[i] != x)
{
L->data[k] = L->data[i];
k++;
}
}
delNUm = L->length - k;
L->length = k;
return delNUm;
}
/**
* [ListRangeDelete 刪除順序表中在start 和 stop 范圍內(nèi)的 元素]
* @param L [待刪除的順序表]
* @param start [刪除值范圍的最小值]
* @param stop [刪除值范圍的最大值]
* @return [成功返回以刪除的元素個(gè)數(shù)叮阅,失敗返回-1]
*/
int ListRangeDelete(mSqList *L,int start,int stop)
{
int k = 0;
int delNUm = 0;
if (start > stop)
{
return -1;
}
if (L->length <= 0)
{
return -1;
}
for (int i = 0; i < L->length; i++)
{
if(L->data[i] < start || L->data[i] > stop)
{
L->data[k] = L->data[i];
k++;
}
}
delNUm = L->length - k;
L->length = k;
return delNUm;
}
/**
* [ListDumpDelete 刪除有序的順序表中含重復(fù)元素的項(xiàng)]
* @param L [待刪除的有序順序表]
* @return [成功返回刪除返回刪除元素個(gè)數(shù)刁品,失敗返回 -1]
*/
int ListDumpDelete(mSqList *L)
{
int k = 0;
int len = 0;
if(L->length <=0 )
{
return -1;
}
for (int i = 1; i < L->length; i++)
{
if (L->data[k] != L->data[i])
{
L->data[++k] = L->data[j];
}
}
len = L->length - k - 1;
L->length = k + 1;
return len;
}
/**
* [ListBindSorted 將兩個(gè)有序表進(jìn)行合并,并且將合并后的有序表返回]
* @param L1 [待合并的有序表L1]
* @param L2 [待合并的有序表L2]
* @param L3 [合并后的有序表L3]
* @return [成功返回 1浩姥,失敗返回 -1]
*/
int ListBindSorted(mSqList *L1, mSqList *L2, mSqList *L3)
{
if (L1->length + L2->length > L3->dataSize)
{
return -1;
}
int i = 0;
int j = 0;
int k = 0;
while(i < L1->Length && j < L2->length)
{
if (L1->data[i] < L2->data[j])
{
L3->data[k++] = L1->data[i++];
}else {
L3->data[k++] = L2->data[j++];
}
}
while(i < L1->length)
{
L3->data[k++] = L1->data[i++];
}
while(j < L2->length)
{
L3->data[k++] = L2->data[j++];
}
L3->length = k;
return 1;
}