C語言實現順序表的基本操作
1.定義
線性表的順序儲存是指在記憶體中用一組地址連續的儲存單元依次儲存線性表的各元素,用這種儲存形式儲存的線性表稱為順序表。也就是說,順序表以資料元素在計算機內的物理位置相鄰來表示資料元素線上性表中的邏輯相鄰關係。
2.線性表的順序儲存示意圖
3.程式碼體現
Seqlist.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#define LIST_SIZE 10/*順序表的的初始分配量*/
#define LIST_INCREMENT 2/*順序表的分配增量*/
typedef int DateType;
typedef struct SeqList
{
DateType* data;/*儲存空間基址*/
int length;/*當前長度*/
int listsize;/*當前分配的儲存容量(以sizeof(DateType))為單位*/
}SeqList,*pSeqList;
/*
SeqList就是所定義的順序表的型別
pSeqList相當於SeqList*,指順序表指標型別
*/
void InitSeqList(pSeqList pSeq);//初始化
void PushBack(pSeqList pSeq, DateType d);//尾部插入
void PrintSeqList(pSeqList pSeq);//列印
void PopBack(pSeqList pSeq);//刪除尾部元素
void PushFront(pSeqList pSeq, DateType d);//頭插元素
void PopFront(pSeqList pSeq);//頭刪元素
int Find(pSeqList pSeq,DateType d);//查詢某一元素
void Insert(pSeqList pSeq, int pos, DateType d);//某一元素前插入
void Erase(pSeqList pSeq, int pos);//刪除指定位置元素
void Remove(pSeqList pSeq, DateType d);//刪除指定元素
void RemoveAll(pSeqList pSeq, DateType d);//刪除所有指定元素
#endif //__SEQLIST_H__
Seqlist.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Seqlist.h"
void InitSeqList(pSeqList pSeq)
{/*
順序表的初始化操作就是為線性表分配一個預定義大小的陣列空間,
並將順序表的當前長度(當前資料的個數sz)設為0。
*/
assert(pSeq != NULL);
pSeq->data = (DateType*)malloc(sizeof(DateType)*LIST_SIZE);
if (!pSeq->data)
{
printf("OVERFLOW");/*儲存分配失敗*/
return;
}
pSeq->length = 0;/*空表的長度為0*/
pSeq->listsize = LIST_SIZE;/*初始儲存容量*/
}
void PushBack(pSeqList pSeq, DateType d)
{
//1.assert
assert(pSeq != NULL);
//2.判斷滿
if (pSeq->length == LIST_SIZE)
{
printf("順序表已滿,無法插入\n");
return;
}
//3.儲存元素
pSeq->data[pSeq->length] = d;
pSeq->length++;
}
void PrintSeqList(pSeqList pSeq)
{
/*把順序表當為陣列來列印*/
int i = 0;
assert(pSeq != NULL);
if (pSeq->length == 0)
{
printf("順序表為空\n");
return;
}
for (i = 0; i < pSeq->length; i++)
{
printf("%d", pSeq->data[i]);
}
printf("\n");
}
void PopBack(pSeqList pSeq)
{
assert(pSeq != NULL);
if (pSeq->length == 0)
{
printf("順序表為空,無法刪除\n");
return;
}
pSeq->length --;
}
void PushFront(pSeqList pSeq, DateType d)
{
assert(pSeq != NULL);
int i = 0;
if (pSeq->length==LIST_SIZE)
{
printf("順序表已滿,無法插入\n");
return;
}
//1.將原有資料後移
for (i = pSeq->length-1; i >= 0; i--)
{
pSeq->data[i + 1] = pSeq->data[i];
}
//2.頭部插入新元素
pSeq->data[0] = d;
pSeq->length++;
}
void PopFront(pSeqList pSeq)
{
int i = 0;
assert(pSeq != NULL);
if (pSeq->length == 0)
{
printf("順序表為空無法刪除\n");
}
for (i = 0; i < pSeq->length - 1; i++)
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->length--;
}
int Find(pSeqList pSeq, DateType d)
{
int i = 0;
assert(pSeq != NULL);
for (i = 0; i < pSeq->length; i++)
{
if (pSeq->data[i] == d)
{
return i;
}
}
return -1;
}
void Insert(pSeqList pSeq, int pos, DateType d)
{
DateType *newbase, *q, *p;
int i = 0;
assert(pSeq != NULL);
assert(pos >= 0 && pos <= pSeq->length);
if (pSeq->length == LIST_SIZE)/*當儲存空間已滿,增加分配*/
{
newbase = (DateType*)relloc((*pSeq).data, ((*pSeq).listsize + LIST_INCREMENT) * sizeof(DateType));
if (!newbase)
{
printf("追加空間失敗\n");
return;
}
pSeq->data = newbase;/*新基址*/
pSeq->listsize = pSeq->listsize + LIST_INCREMENT;/*增加儲存容量*/
}
for (i = (pSeq->length) - 1; i >= pos; i--)/*元素後移*/
{
pSeq->data[i + 1] = pSeq->data[i];
}
pSeq->data[pos] = d;
pSeq->length++;
}
void Erase(pSeqList pSeq, int pos)
{
int i = 0;
assert(pSeq != NULL);
assert(pos >= 0 && pos <= pSeq->length);
if (pSeq->length == 0)
{
printf("順序表為空,無法刪除\n");
}
for (i = pos; i < pSeq->length - 1; i++)
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->length--;
}
void Remove(pSeqList pSeq, DateType d)
{
int i = 0;
assert(pSeq != NULL);
if (pSeq->length == 0)
{
printf("順序表為空,不需要刪除\n");
return;
}
for (i = 0; i < pSeq->length; i++)
{
if (pSeq->data[i] == d)
{
break;
}
}
//跳轉到這有兩種情況,1.找到了指定元素;2.遍歷完整個順序表未找到
if (i == pSeq->length)
{
printf("刪除的元素不存在\n");
return;
}
for (; i < pSeq->length - 1; i++)//刪除
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->length--;
}
void RemoveAll(pSeqList pSeq, DateType d)
{
int i = 0;
assert(pSeq != NULL);
//if (pSeq->sz == 0)
//{
// printf("順序表為空,不需要刪除\n");
// return;
//}
//for (i = 0; i < pSeq->sz; i++)
//{
// if (pSeq->data[i] == d)
// {
// int j = 0;
// for (j = i; j < pSeq->sz-1; j++)//這種演算法存在一個問題,連著的相同元素不能刪除乾淨
// {
// pSeq->data[j] = pSeq->data[j + 1];
// }
// pSeq->sz--;
// --i;//消除這個問題
// }
//}
int count = 0;
DateType *tmp = NULL;
tmp = (DateType*)malloc(sizeof(DateType)*pSeq->length); /*申請一個臨時空間*/
for (i = 0; i < pSeq->length; i++)/*把原空間中的指定元素排除,其餘元素拷貝到新空間*/
{
if (pSeq->data[i] != d)
{
tmp[count++] = pSeq->data[i];
}
}
memcpy(pSeq->data, tmp, sizeof(DateType)*count);/*新空間存的是正確的元素,再將這些元素拷貝會原空間*/
pSeq->length = count;
free(tmp);
tmp = NULL;
}
相關推薦
C語言實現線性表基本操作
style eal struct fine fin delete class logs destroy #include <stdio.h> #include <tchar.h> #include <stdlib.h> #define
C語言實現順序表的基本操作
1.定義 線性表的順序儲存是指在記憶體中用一組地址連續的儲存單元依次儲存線性表的各元素,用這種儲存形式儲存的線性表稱為順序表。也就是說,順序表以資料元素在計算機內的物理位置相鄰來表示資料元素線上性表中的邏輯相鄰關係。 2.線性表的順序儲存示意圖
資料結構-C語言實現順序表
#include<stdio.h> #include<stdlib.h> #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREAMENT 10 #define OK 1
嚴蔚敏資料結構C語言實現棧的基本操作
int main(){ SqStack S; SElemType *e; int n,i; InitStack(&S); printf("請輸入需要入棧的資料個數\n"); scanf("%d",&n); for(i=0;i<n;i++) { sca
用C語言實現順序表的增刪查改和逆置
在資料結構中,我們最開始接觸的就是順序表,那麼順序表是什麼呢?順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組地址連續的儲存單元依次儲存資料元素的線性結構。線性表採用順序儲存的方式儲存就稱之為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地
c語言實現圖的基本操作--鄰接矩陣儲存
利用鄰接矩陣容易判定任意兩個頂點之間是否有邊(或弧)相連,並容易求得各個頂點的度。 c語言程式碼實現如下: #include<stdio.h> #include<stdlib.h> #define MAX_VER_NUM 50 typedef cha
資料結構演算法實現-順序表基本操作
資料結構演算法實現 實現了高一凡的<<資料結構>>,書中的程式碼是基於VC6++ c++語言實現的,網上也可以找到TC版的c語言實現的原始碼,TC版的原始碼平臺是 Turbo C 2.0 ,編譯軟體相對較早,因此將採用CodeBlock
C語言實現順序表
大二學習資料結構和演算法啦,因為之前用Java語言實現過,所以理解起來還是比較輕鬆,就是理解陣列與結構體的運用。廢話不多說,上程式碼! 結構體 typedef struct { int *data; int Maxsz; int len; } SeqList; 初始化
資料結構C/C++程式碼實現 順序表棧基本操作
順序表棧基本操作的實現 原始碼: #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define MAXSIZE 100 //#d
C語言實現順序棧的基本操作
//標頭檔案內容//--------------------棧的順序儲存結構-------------------- #define STACK_INIT_SIZE 100 #define STACKINCREACE 10 typedef int Elemtype;//在
順序表基本操作(c實現)
順序表就是以陣列形式儲存的線性表,本文將在PTA上做過的題的程式碼copy下來,供以參考,詳解見註釋 //庫函式標頭檔案包含 #include<stdio.h> #include<malloc.h> #include<stdlib.h>
c語言實現單鏈表資料結構及其基本操作
帶頭結點單鏈表。分三個檔案,分別為標頭檔案,測試檔案,原始碼檔案。 給出了單鏈表的部分操作,每個操作都有對應的註釋說明該函式功能。 test.c 檔案中,對輸入資料是否合法進行了檢測,但是並未實現輸入資料不合法時應該採取的措施。 測試檔案 通過一個選單來測試單鏈
資料結構—順序表基本操作(c語言程式碼)
順序表計算機內部儲存一張線性表是用一組連續地址記憶體單元,這種儲存結構即為順序儲存結構,這種結構下的線性表叫順序表。順序表有兩種定義方法: 1.靜態定義
順序表基本操作的實現
oid new for fine h+ 基本 delet 輸出 turn 順序表基本操作的實現,主要包括順序表的初始化、建立、輸出、插入、刪除、位置查詢、數據查詢。 #include<iostream.h>#define MAXSIZE 100typedef i
C語言動態順序表的實現
上一次我們實現了靜態順序表,靜態順序表的大小固定,不方便我們去存取資料。 而動態順序表就可以很方便的存取資料。 同樣,我們有以下介面要實現: #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<stdio.h> #include
C語言_棧的基本操作(順序棧)
##本片部落格主要是順序棧的基本操作,包含以下內容: 初始化 入棧 出棧 判空 判滿 返回棧頂元素(棧頂元素不出棧) 返回棧頂元素(棧頂元素出棧) ###順序棧的初始化: 初始化順序棧時只需要讓棧頂等零 void InitStack (Stack *p) //初始化
c++學習筆記—單鏈表基本操作的實現
用c++語言實現的單鏈表基本操作,包括單鏈表的建立(包括頭插法和尾插法建表)、結點的查詢、刪除、排序、列印輸出、逆置、連結串列銷燬等基本操作。 IDE:vs2013 具體實現程式碼如下: #include "stdafx.h" #include <malloc.h
用C語言進行順序表的實現
在C語言的學習中,資料結構中的線性資料結構分為順序表和連結串列,今天就簡單的實現一下靜態順序表。 首先是標頭檔案的實現: SeqList.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h&g
c語言實現順序棧的基本功能
#include<stdio.h> #include<stdlib.h> #define maxsize 100 typedef struct SqStack{ int data[maxsize]; int top; }SqStack,*pSqStac
c++實現單鏈表基本操作
程式媛決定好好學習寫程式碼 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,