1. 程式人生 > >c語言:順序表的實現(一) 建立,插入,刪除,查詢,輸出等基本操作實現

c語言:順序表的實現(一) 建立,插入,刪除,查詢,輸出等基本操作實現

#include<iostream>
#include<stdio.h>
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
using namespace std;
struct Sqlist{
	long *elem, *newlist;
	int Length;
	int listsize;
};
void Error(char *s)
{
	cout << s << endl;
	exit(1);
}
void InitList_Sq(Sqlist &L)     //建立含有若干個資料元素的順序表
{
	L.elem = new long[LIST_INIT_SIZE];
	if (!L.elem)
		Error("Overflow!");
	L.Length = 0;
	L.listsize = LIST_INIT_SIZE;
}
void Create_Sq(Sqlist *L)
{
	int i, num;
	cout << "請輸入順序表元素個數:";
	cin >> num;
	cout << "請輸入資料元素:";
	for (i = 0; i<num; i++)
	{
		cin >> L->elem[i];
		L->Length++;
	}
	cout << "建立順序表成功:!" << endl;;
}

void Increment(Sqlist &L)    //為順序表擴充套件LIST_INCREMEN個數據元素的空間
{
	L.newlist = new long[L.listsize + LIST_INCREMENT];//增加LIST_INCREMENT個儲存空間
	if (!L.newlist)
		Error("Overflow!");//儲存分配失敗
	for (int i = 0; i < L.Length; i++)   //騰挪原空間中的資料元素到新的資料空間中
	{
		L.newlist[i] = L.elem[i];
	}//釋放元素所佔用的原空間
	L.elem = L.newlist;//移交空間首地址;//移交空間首地址
	delete[] L.elem;
	L.listsize += LIST_INCREMENT; //修改當前順序表的最大空間
}


void ListInsert_Sq(Sqlist &L, int i,int e)
//在順序表L中第i個位置前插入元素e;若插入位置不合理則給出相關資訊並退出執行,
//i的合理範圍是1<=i<=L.length+1
{
	if ((i<1) || (i>L.Length + 1))         //插入元素的引數不合理
		Error("Position Error!");
	if (L.Length >= LIST_INIT_SIZE)        //若當前儲存空間已滿,則增加空間
		Increment(L);                      //增加空間函式
	long *q = &(L.elem[i - 1]);          //令指標q指向插入位置
	long *p = &(L.elem[L.Length - 1]);
	for (p; p >= q; p--)                     //以此向後移動元素
	{
		*(p + 1) = *p;
	}
	*q = e;                                 //在L的第i個位置插入元素e
	L.Length++;                             //修改當前順序表的長度
}

void ListDelete_Sq(Sqlist &L, int i, int &e)
//刪除順序表中第i個元素並用e返回其值
{
	if (i<1 || i>L.Length)   //刪除元素的引數不合理
		Error("Position Error!");
	e = L.elem[i - 1];     //將待刪除的元素的值賦給e
	long *p = &(L.elem[i - 1]);  //指向待刪處元素的位置
	for (++p; p <= (L.elem + L.Length - 1); p++)//以此向前移動元素
	{
		*(p - 1) = *p;
	}
	L.Length--;
	cout << "刪除的元素是:";
	cout << e << endl;
}//修改L的長度

int LocatElem_Sq(Sqlist L, int e)
{
	int j = 1;
	long *q = L.elem;
	while ((j <= L.Length) && (*q!= e))
	{
		j++;
		q++;
	}
	if (j < L.Length)
		return j;
	else
		return 0;
}

void getElem_Sq(Sqlist L, int i, int &e) //輸出順序表中要操作的那個元素
{
	if ((i<1) || (i>L.Length))          //判斷輸出要求引數是否合理
		Error("Position Error!");
	e = L.elem[i - 1];    //用e返回順序表中第i個元素值
	cout << e << endl;
}

void printElem_Sq(Sqlist L)        //輸出順序表中現有的所有元素
{
	cout << " 順序表中的元素如下:" << endl;
	int i;
	for (i = 0; i< L.Length; i++)
	{
		cout <<" "<< L.elem[i];
	}
	cout << endl;
}

int main()
{
	Sqlist L;
	int e,n,number;
	while (1)
	{
		cout << "    1、建立資訊表" << endl;
		cout << "    2、插入元素" << endl;
		cout << "    3、查詢元素" << endl;
		cout << "    4、刪除元素" << endl;
		cout << "    5、退出程式" << endl;
		cout << "    請選擇所要執行的操作:";
		cin >> n;
		switch (n)
		{
		case 1:
			InitList_Sq(L);
			Create_Sq(&L);
			printElem_Sq(L);
			break;
		case 2:
			cout << "請輸入插入的位置和元素:";
			cin >> number >> e;
			while (e != 0)
			{
				ListInsert_Sq(L, number, e);
				printElem_Sq(L);
				cout << "請輸入插入的位置和元素:";
				cin >> number >> e;
				
			}
			break;
		case 3:
			cout << "請輸入查詢的元素:";
			cin >> e;
			while (e!=0)
			{
				LocatElem_Sq(L, e);
				cout << "該元素所在順序表的位置位置是:" << LocatElem_Sq(L, e) << endl;
				cout << "該元素是:";
				getElem_Sq(L, LocatElem_Sq(L, e), e);
				cout << "請輸入查詢的元素:";
				cin >> e;
			}
			break;
		case 4:
			cout << "請輸入要刪除的位置 :";
			cin >> number;
			ListDelete_Sq(L, number, e);
			printElem_Sq(L);
			break;//程式結束
		case 5:
			exit(1);
			break;//程式結束
		default:
			cout << "輸入錯誤,請重新輸入!!!!!" << endl;
			continue;
		}
	}
	return 0;
}

相關推薦

c語言:順序實現 建立插入刪除查詢輸出基本操作實現

#include<iostream> #include<stdio.h> #define LIST_INIT_SIZE 100 #define LIST_INCREMENT 10 using namespace std; struct Sqlist{

C語言代碼訓練

color tro 題型 blank adding bsp 喜歡 add 方便 今天我們先來講解一道C語言的經典例題,也是從零開始系列中的一道課後練習題。 請用控制臺程序繪制如下圖案。 循環經典例題 分析情況 這個題目是要求打印30行"*",每行打印的個數不同。通過這

C語言基礎複習筆記指標

最近linux很火,年前對linux再詳細瞭解了個大概,結合在windows平臺活躍與強大無比的C++,最終得出一個結論:C語言依然強大。 過年回來,便對的C語言充滿了興趣,於是乎去網上下載了教程回來,細細研讀,基礎程式設計思想始終是很重要的。 首先,入手的便是C語言的核心精華部分,指標。要

c語言指標進階

指標也是一種資料型別 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。 1)指標是一種變數,佔有記憶體空間,用來儲存記憶體地址

C語言面向物件程式設計:封裝與繼承

最近在用 C 做專案,之前用慣了 C++ ,轉回頭來用C 還真有點不適應。 C++ 語言中自帶面向物件支援,如封裝、繼承、多型等面向物件的基本特徵。 C 原本是面向過程的語言,自身沒有內建這些特性,但我們還是可以利用 C 語言本身已有的特性來實現面向物件的一些基本特徵。接下來

程式設計菜鳥到大佬之路:C語言程式特別篇

程式設計習題 迴圈例題選講 例1.乘方計算 給出一個整數a和一個正整數n,求乘方ana^nan。 輸入:一行,包含兩個整數a和n。 -1000000 <= a <= 1000000,1 <= n <= 10000。 輸出:一個整數,

C語言入門之旅

特殊的迴圈語句 ,讓for迴圈開始的方法: 將sum初始化為0;或者先在迴圈體外讀第一個數 注意要先判斷再運算,避免最後一個數據發生錯誤 for(sum=0;n!=-1;) { sum+=n; scanf(“%d”, n); } 輸入x,y之間的閏年 i

C語言編程練習

ota fin void 語言 enc main.c pre rotate mail 問題描述:.給出一個英語句子,希望你把句子裏的單詞順序都翻轉過來    輸入樣例:I love you   輸出樣例:you love I 1 /****************

Windows下C語言開發環境配置:MinGW的簡介和安裝

Windows下C語言開發環境配置(一):MinGW的安裝和eclipse的配置 1.什麼是MinGW? MinGW即Minimalist GNU for Windows,是一個簡單Windows本地應用的開發環境。MinGW包含有一組GNU編譯器的集合(包

C語言基礎面試題

1.寫出判斷ABCD四個表示式的是否正確, 若正確, 寫出經過表示式中 a的值 int a = 4; (A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++); a = ?答:C錯誤,左側不是一個有效變

C語言之網路程式設計域名解析

在網路程式設計時,知道域名是不能直接訪問一個主機的,需要轉換成相應的IP地址。有時在程式中需要將一個IP地址轉換成一個域名。本節將講解C程式中的IP地址與域名的轉換問題。 提示:在TCP/IP網路中,通訊雙方的主機必須知道彼此的IP地址方可進行正常的通訊,如果給出的主機的域

C語言常見錯誤雜談scanf()、scanf_s()與錯誤 C4996與解決方法

錯誤 C4996 初學C語言時,第一個接觸到的I/O函式便是scanf()了。但在高版本的 Visual Studio (包括但不限於2015、2013、2012)編譯程式碼時,卻會出現意想不到的錯誤。 有如下一段簡單的程式碼: #include "stdio.h" int main(void) {

C語言經典筆試題

1、請填寫bool , float, 指標變數 與“零值”比較的if 語句。 提示:這裡“零值”可以是0, 0.0 , FALSE 或者“空指標” 。例如int 變數n 與“零值”比較的if 語句為: if ( n == 0 ) if ( n

C語言筆試題紀錄

分配方式有三種:   1、從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。   2、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中

C語言檔案與目錄

注意包含標頭檔案 #include <sys/types.h> #include <sys/stat.h> 1.建立與刪除目錄 在Linux系統中,目錄就是一個資料夾,檔案可以存放在目錄中。目錄是一種特殊的檔案,需要對目錄設定許可權。 建立目錄函式m

C語言學習重點總結基本資料型別分析

一.資料型別的含義: 1.資料型別可以理解為固定大小的別名; 2.資料型別是建立變數的模子; 二.變數的本質: 1.變數是一段實際連續儲存空間的別名; 2.程式中通過變數來申請並命名儲存空間; 3.通過關鍵字可以使用儲存空間; 例項分析: 步驟:

c語言練手專案

統計檔案的字元數、單詞數以及總行數,包括: 每行的字元數和單詞數 檔案的總字元數、總單詞數以及總行數 注意: 空白字元(空格和tab縮排)不計入字元總數; 單詞以空格為分隔; 不考慮一個單詞在兩行的情況; 限制每行的字元數不能超過1000。 請先看程式碼:

淺談C語言的資料儲存

程式由指令和資料組成,C語言程式亦是如此。開發者在編寫程式的時候往往需要根據不同資料的特點以及程式需求來選擇不同的資料儲存方式,那麼在C語言中資料的儲存分為哪些方式呢? C程式大致來講可以分為四個資料區:常量區,靜態去,堆區,棧區。 其中常量區儲存了未被作為初始化使用的字

linux下C語言多執行緒執行緒的建立與取消

#include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void

二叉查詢二叉排序樹建立插入刪除查詢-C語言

二叉查詢樹:或者是一顆空樹;或者是具有以下性質的二叉樹:(1)若它的左子樹不為空,則左子樹上所有結點的值都小於根結點的值;(2)若它的右子樹不為空,則右子樹所有結點的值均大於它的根結點的值;(3)左右子樹分別為二叉查詢樹; #include <std