這篇文章主要為大家展示了“web中如何實現實現順序表”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“web中如何實現實現順序表”這篇文章吧。
seqlist.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define INIT_SIZE 2
#define ADD_SIZE 3
typedef int DataType;
typedef struct Seqlist
{
DataType *data;
int size; //當前空間存儲的元素個數
int capacity; //當前空間所能存儲的最大容量
}Seqlist,*pSeqlist;
void InitSeqlist(pSeqlist pSeq);
void DestorySeqlist(pSeqlist pSeq);
void PushBack(pSeqlist pSeq,DataType x);
void PopBack(pSeqlist pSeq);
void PushFront(pSeqlist pSeq,DataType x);
void PopFront(pSeqlist pSeq);
void Remove(pSeqlist pSeq,DataType x);
void RemoveAll(pSeqlist pSeq,DataType x);
void BubbleSort(pSeqlist pSeq);
void InsertSort(pSeqlist pSeq);
void SelectSort(pSeqlist pSeq);
int BinarySearch(pSeqlist pSeq,DataType x);
void Erase(pSeqlist pSeq,int pos);
void PrintSeqlist(pSeqlist pSeq);
#endif //SEQLIST_D_H__seqist.c
#include"seqlist.h"
void InitSeqlist(pSeqlist pSeq)
{
pSeq->data = (DataType *)malloc(INIT_SIZE*sizeof(DataType));
if (pSeq->data == NULL)
{
printf("out of memory\n");
exit(1);
}
pSeq->size = 0;
pSeq->capacity = INIT_SIZE; //將容量置為當前空間所能存儲的最大值
}
void DestorySeqlist(pSeqlist pSeq)
{
free(pSeq->data);
pSeq->data = NULL;
pSeq->size = 0;
pSeq->capacity = 0;
}
void CheckCapacity(pSeqlist pSeq) //查看當前空間是否已滿
{
assert(pSeq);
if (pSeq->size == pSeq->capacity) //如果滿了則進行擴容
{
DataType *tmp = NULL;
tmp = (DataType *)realloc(pSeq->data, (pSeq->capacity += ADD_SIZE)*sizeof(DataType));
if (NULL == tmp)
{
printf("out of memory\n");
exit(1);
}
pSeq->data = tmp;
}
}
void PushBack(pSeqlist pSeq, DataType x)
{
assert(pSeq);
CheckCapacity(pSeq); //只要插入元素,首先就要檢查空間是否以滿
pSeq->data[pSeq->size++] = x; //插入元素后size也要變化
}
void PopBack(pSeqlist pSeq)
{
assert(pSeq);
if (pSeq->size == 0) //異常情況,表已空
{
printf("表已空\n");
return;
}
pSeq->size--;
}
void PushFront(pSeqlist pSeq, DataType x)
{
int i = 0;
assert(pSeq);
CheckCapacity(pSeq); //只要插入元素,首先就要檢查空間是否以滿
for (i = pSeq->size; i > 0; i--) //從后往前先將數據移動
{
pSeq->data[i] = pSeq->data[i-1];
}
pSeq->data[0] = x;
pSeq->size++;
}
void PopFront(pSeqlist pSeq)
{
int i = 0;
assert(pSeq);
if (pSeq->size == 0) //異常情況,表空
{
printf("表已空\n");
return;
}
for (i = 0; i < pSeq->size-1; i++) //直接從第二個元素依次向前覆蓋
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->size--;
}
void Remove(pSeqlist pSeq, DataType x) //刪除第一個出現的x
{
int i = 0;
int j = 0;
assert(pSeq);
for (i = 0; i < pSeq->size; i++)
{
if (pSeq->data[i] == x)
{
for (j = i; j < pSeq->size-1; j++) //刪除的時候從這個元素的后面向前覆蓋
{
pSeq->data[j] = pSeq->data[j + 1];
}
pSeq->size--;
return;
}
}
}
void RemoveAll(pSeqlist pSeq, DataType x)
{
int i = 0;
int j = 0;
assert(pSeq);
for (i = 0; i < pSeq->size; i++)
{
if (pSeq->data[i] == x)
{
for (j = i; j < pSeq->size - 1; j++) //刪除的時候從這個元素的后面向前覆蓋
{
pSeq->data[j] = pSeq->data[j + 1];
}
pSeq->size--;
}
}
}
void BubbleSort(pSeqlist pSeq)
{
int flag = 0;
int i = 0;
int j = 0;
int k = pSeq->size-1;
assert(pSeq);
for (i = 0; i < pSeq->size - 1; i--)
{
int m = 0;
flag = 1; //將標記置1
for (j = 0; j < k; j++)
{
if (pSeq->data[j]>pSeq->data[j + 1])
{
DataType tmp = pSeq->data[j];
pSeq->data[j] = pSeq->data[j + 1];
pSeq->data[j + 1] = tmp;
flag = 0;
m = j; //記錄最后一次交換的位置
}
}
if (flag) //標記位1表示已經有序
{
return;
}
m = k; //將k設置成最后一次交換的位置
}
}
void InsertSort(pSeqlist pSeq) //插入排序
{
int i = 0;
int j = 0;
assert(pSeq);
for (i = 1; i < pSeq->size; i++)
{
DataType tmp = pSeq->data[i];
for (j = i-1; j >=0; j--)
{
if (pSeq->data[j]>tmp)
{
pSeq->data[j+1] = pSeq->data[j];
}
else
{
break;
}
}
pSeq->data[j+1] = tmp;
}
}
void SelectSort(pSeqlist pSeq)
{
int i = 0;
int j = 0;
int k = 0;
assert(pSeq);
for (i = 0; i < pSeq->size; i++)
{
k = i;
for (j = i + 1; j < pSeq->size; j++)
{
if (pSeq->data[k]>pSeq->data[j])
{
k = j;
}
}
if (k != i)
{
DataType tmp = pSeq->data[k];
pSeq->data[k] = pSeq->data[i];
pSeq->data[i] = tmp;
}
}
}
int BinarySearch(pSeqlist pSeq, DataType x)
{
int left = 0;
int right = pSeq->size - 1;
int mid=0;
assert(pSeq);
mid = (left&right) + ((left^right) >> 1); //求平均值
while (left <= right)
{
if (pSeq->data[mid]>x)
{
right = mid - 1;
}
else if (pSeq->data[mid] < x)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
void Erase(pSeqlist pSeq, int pos)
{
int i = 0;
assert(pSeq);
if (pos>= pSeq->size&&pos < 0)
{
printf("刪除位置不合法\n");
return;
}
for (i = pos; i < pSeq->size - 1; i++) //從pos之后依次向前覆蓋
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->size--;
}
void PrintSeqlist(pSeqlist pSeq)
{
int i = 0;
assert(pSeq);
if (pSeq->size == 0)
{
printf("表為空\n");
return;
}
for (i = 0; i < pSeq->size; i++)
{
printf("%d ", pSeq->data[i]);
}
printf("\n");
}test.c
#include"seqlist.h"
void menu()
{
printf("0.exit 1.PrintSeqlist \n");
printf("2.InitSeqlist 3.PushBack \n");
printf("4.Popback 5.PushFornt \n");
printf("6.PopFornt 7.Erase \n");
printf("8.Remove 9.RemoveAll \n");
printf("10.BubbleSort 11.BinarySearch\n");
printf("12.DestorySeqlist 13.InsertSort \n");
printf("14.SelectSort \n");
printf("請輸入:>");
}
void test(pSeqlist pSeq)
{
DataType x = 0;
int n = 0;
int pos = 0;
int ret=0;
while (1)
{
menu();
scanf("%d", &n);
switch (n)
{
case 0:
exit(1);
break;
case 1:
PrintSeqlist(pSeq);
break;
case 2:
InitSeqlist(pSeq);
break;
case 3:
printf("請輸入元素\n");
scanf("%d", &x);
PushBack(pSeq, x);
break;
case 4:
PopBack(pSeq);
break;
case 5:
printf("請輸入元素\n");
scanf("%d", &x);
PushFront(pSeq, x);
break;
case 6:
PopFront(pSeq);
break;
case 7:
printf("請輸入刪除位置\n");
scanf("%d", &pos);
Erase(pSeq, pos);
break;
case 8:
printf("請輸入元素\n");
scanf("%d", &x);
Remove(pSeq, x);
break;
case 9:
printf("請輸入元素\n");
scanf("%d", &x);
RemoveAll(pSeq, x);
break;
case 10:
BubbleSort(pSeq);
break;
case 11:
printf("請輸入元素\n");
scanf("%d", &x);
ret=BinarySearch(pSeq, x);
if (ret == -1)
printf("沒有這個元素\n");
printf("下標為:%d\n", ret);
break;
case 12:
DestorySeqlist(pSeq);
break;
case 13:
InsertSort(pSeq);
break;
case 14:
SelectSort(pSeq);
break;
default:
printf("輸入無效\n");
break;
}
}
}
int main()
{
Seqlist pSeq;
test(&pSeq);
system("pause");
return 0;
}以上是“web中如何實現實現順序表”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。