資料結構第五版第二章實驗2.實現單鏈表的各種基本運算
編寫一個程式exp2-2.cpp,實現單鏈表的各種基本運算(假設單鏈表的元素型別為char)
並在此基礎上完成如下功能:
(1)初始化單鏈表h;
(2)採用尾插法依次插入元素a,b,c,d,e;
(3)輸出單鏈表h;
(4)輸出單鏈表h長度;
(5)判斷單鏈表h是否為空;
(6)輸出單鏈表h的第3個元素;
(7)輸出元素a的位置;
(8)在第4個元素位置上插入元素f;
(9)輸出單鏈表h;
(10)刪除h的第3個元素;
(11)輸出單鏈表h;
(12)釋放單鏈表h
//檔名:單鏈表的基本運算實現
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct LNode //定義單鏈表結點型別
{
ElemType data;
struct LNode *next;
} LinkList;
void InitList(LinkList *&L) //初始化線性表
{
L=(LinkList *)malloc(sizeof(LinkList)); //建立頭結點
L->next=NULL;
}
void DestroyList(LinkList *&L) //銷燬線性表
{
LinkList *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
bool ListEmpty(LinkList *L) //判線性表是否為空表
{
return(L->next==NULL);
}
int ListLength(LinkList *L) //求線性表的長度
{
LinkList *p=L;int i=0;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return (i);
}
void DispList(LinkList *L) //輸出線性表
{
LinkList *p=L->next;
while (p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
bool GetElem(LinkList *L,int i,ElemType &e) //求線性表中某個資料元素值
{
int j=0;
LinkList *p=L; //p指向頭節點,j置為0(即頭節點的序號為0)
while (j<i && p!=NULL) //找第i個節點
{ j++;
p=p->next;
}
if (p==NULL) //不存在第i個數據節點,返回0
return false;
else //存在第i個數據節點,返回1
{ e=p->data;
return true;
}
}
int LocateElem(LinkList *L,ElemType e) //按元素值查詢
{ int i=1;
LinkList *p=L->next; //p指向開始節點,i置為1(即開始節點的序號為1)
while (p!=NULL && p->data!=e) //查詢data值為e的節點,其序號為i
{ p=p->next;
i++;
}
if (p==NULL) //不存在元素值為e的節點,返回0
return(0);
else //存在元素值為e的節點,返回其邏輯序號i
return(i);
}
bool ListInsert(LinkList *&L,int i,ElemType e) //插入資料元素
{
int j=0;
LinkList *p=L,*s; //p指向頭節點,j置為0(即頭節點的序號為0)
while (j<i-1 && p!=NULL) //查詢第i-1個節點
{ j++;
p=p->next;
}
if (p==NULL) //未找到第i-1個節點,返回false
return false;
else //找到第i-1個節點*p,插入新節點並返回1
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=e; //建立新節點*s,其data域置為e
s->next=p->next; //將*s插入到*p之後
p->next=s;
return true;
}
}
bool ListDelete(LinkList *&L,int i,ElemType &e) //刪除資料元素
{
int j=0;
LinkList *p=L,*q; //p指向頭節點,j置為0(即頭節點的序號為0)
while (j<i-1 && p!=NULL) //查詢第i-1個節點
{ j++;
p=p->next;
}
if (p==NULL) //未找到第i-1個節點,返回false
return false;
else //找到第i-1個節點*p
{ q=p->next; //q指向第i個節點
if (q==NULL) //若不存在第i個節點,返回false
return false;
e=q->data;
p->next=q->next; //從單鏈表中刪除*q節點
free(q); //釋放*q節點
return true; //返回true表示成功刪除第i個節點
}
}
extern void InitList(LinkList *&L);
extern void DestroyList(LinkList *&L);
extern bool ListEmpty(LinkList *L);
extern int ListLength(LinkList *L);
extern void DispList(LinkList *L);
extern bool GetElem(LinkList *L,int i,ElemType &e);
extern int LocateElem(LinkList *L,ElemType e);
extern bool ListInsert(LinkList *&L,int i,ElemType e);
extern bool ListDelete(LinkList *&L,int i,ElemType &e);
int main()
{
LinkList *h;
ElemType e;
printf("單鏈表的基本運算如下:\n");
printf(" (1)初始化單鏈表h\n");
InitList(h);
printf(" (2)依次採用尾插法插入a,b,c,d,e元素\n");
ListInsert(h,1,'a');
ListInsert(h,2,'b');
ListInsert(h,3,'c');
ListInsert(h,4,'d');
ListInsert(h,5,'e');
printf(" (3)輸出單鏈表h:");
DispList(h);
printf(" (4)單鏈表h長度=%d\n",ListLength(h));
printf(" (5)單鏈表h為%s\n",(ListEmpty(h)?"空":"非空"));
GetElem(h,3,e);
printf(" (6)單鏈表h的第3個元素=%c\n",e);
printf(" (7)元素a的位置=%d\n",LocateElem(h,'a'));
printf(" (8)在第4個元素位置上插入f元素\n");
ListInsert(h,4,'f');
printf(" (9)輸出單鏈表h:");
DispList(h);
printf(" (10)刪除h的第3個元素\n");
ListDelete(h,3,e);
printf(" (11)輸出單鏈表h:");
DispList(h);
printf(" (12)釋放單鏈表h\n");
DestroyList(h);
}
實際上課本上要求分別設計Linklist和exp2-2兩個程式,而這裡我將兩部分合併為一個,結果是相同的。如果要拆分開,只需將main函式提取出來作為linklist程式。
相關推薦
資料結構第五版第二章實驗2.實現單鏈表的各種基本運算
編寫一個程式exp2-2.cpp,實現單鏈表的各種基本運算(假設單鏈表的元素型別為char) 並在此基礎上完成如下功能: (1)初始化單鏈表h; (2)採用尾插法依次插入元素a,b,c,d,e; (3)輸出單鏈表h; (4)輸出單鏈表h長度;
C++Primer第五版 第二章習題答案(11~20)
2.11 涉及知識點: 宣告:使得名字為程式所知,如果想使用該變數,則必須實現包含其宣告。宣告會確定變數的名字和型別。 定義:創建於名字關聯的實體。定義會申請儲存空間,可能會賦予初始值。 如果想宣告一
資料結構第五次作業第三章
特殊線性表——棧 const int StackSize=100; template class SeqStack { public: SeqStack(){top=-1;}; ~SeqStack(); void Push(T x); T Pop(); T GetTop(){if(top!=
玩轉資料結構——第五章:二分搜尋樹
內容概要: 為什麼要研究樹結構 二分搜尋樹基礎 向二分搜尋樹中新增元素 改進新增操作:深入理解遞迴終止條件 二分搜尋樹的查詢操作 二手搜尋樹的前序遍歷 二分搜尋樹的中序遍歷和後序遍歷 深入理解二分搜尋樹的前中後遍歷(深度遍歷) 二分搜尋樹是的
資料結構第三章實驗2.實現鏈棧的各種基本運算
(1)初始化棧s。 (2)判斷棧s是否為空。 (3)依次進棧元素a,b,c,d,e。 (4)判斷棧s是否為空。 (5)輸出出棧序列。 (6)判斷棧s是否為空。 (7)釋放棧。 #include <stdio.h> #include &l
C++ Primer 第五版 第一章總結
由於第一章只是簡單介紹,我就沒什麼好總結的。於是,我就寫一些我覺得自己要記住和自己以前不知道的知識點吧。 1. iostream庫包含兩個基礎型別 istream 和 ostream,分別表示輸入流和輸出流。一個流就是一個字元序列,是從IO裝置
《C++Primer》第五版 第一章程式設計題部分答案
練習1.9 #include<iostream> using namespace std; int main() { int val = 50, sum = 0; while (val <= 100) { sum += val; ++val
C Prime Plus(第6版) 第二章答案
/*前幾個太簡單了,就不贅述了(其實就是忘了存,尷尬,汗.jpg)*/ /*2.4*/ #include<stdio.h> void jolly(); void deny(); int main() { jolly(); jolly(); jolly()
為什麼我要放棄javaScript資料結構與演算法(第二章)—— 陣列
第二章 陣列 幾乎所有的程式語言都原生支援陣列型別,因為陣列是最簡單的記憶體資料結構。JavaScript裡也有陣列型別,雖然它的第一個版本並沒有支援陣列。本章將深入學習陣列資料結構和它的能力。 為什麼用陣列 需求:儲存所在城市每個月的平均溫度,可以這麼實現 var averageTemp1 = 43.3;
《深入理解計算機系統》(第三版)第二章部分知識點總結
資訊的表示和處理 本渣渣要進行CSAPP期中考了,但是上半學期啥也沒聽QWQ,只能臨陣磨槍了*學習要點*1、計算機如何表示數字2、其他形式資料的基本屬性*資訊儲存*位元組:最小的可定址的記憶體單位地址:記憶體中每個位元組都由一個唯一的數字來標識虛擬地址空間:所有可能
【資料結構基礎筆記】第二章線性表之單鏈表
目錄 一、簡要 1、涵蓋內容 2、學習要求 二、匯入 三、線性連結串列 1、鏈式儲存結構 2、注意點 四、單鏈表 1、單鏈表優點 2、單鏈表缺點 3、結點型別描述 4、注意點 五、單鏈表的實現 1、連結串列的創立 2、連結串列的操作
c++ primer 第五版第一章習題書店程式
#include <iostream> #include "Sales_item.h" /* run this program using the console pauser or add your own getch, sy
C++ Primer 第五版第一章Sales_item.h原始碼
/* * This file contains code from "C++ Primer, Fifth Edition", by Stanley B. * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered
JS資料結構第五篇 --- 二叉樹和二叉查詢樹
一、二叉樹的基本概念 從邏輯結構角度來看,前面說的連結串列、棧、佇列都是線性結構;而今天要了解的“二叉樹”屬於樹形結構。 1.1 多叉樹的基本概念,以上圖中“多叉樹”為例說明 節點:多叉樹中的每一個點都叫節點;其中最上面的那個節點叫“根
第二章作業題2-連結串列-計算機17級 7-3 jmu-ds-單鏈表的基本運算 (15 分)
7-3 jmu-ds-單鏈表的基本運算 (15 分) 實現單鏈表的基本運算:初始化、插入、刪除、求表的長度、判空、釋放。 (1)初始化單鏈表L,輸出L->next的值; (2)依次採用尾插法插入元素:輸入分兩行資料,第一行是尾插法需要插入的字元資料的個數,第二行是具體
數據結構(嚴蔚敏、吳偉民)——讀書筆記-2、 線性表及其基本運算、順序存儲結構
content pri 線性 時間復雜度 length 將他 ron 個數 p s 第二章 線性表 2.1 線性表及其基本運算 2.2 線性表的順序存儲結構 2.3 線性表的鏈式存儲結構 1、線性表:是n個數據元素的有限序列。
資料結構第六次作業第五、六章
第五章 樹通常有前序遍歷,後序遍歷和層序遍歷三種。 前序遍歷:template<class T> void BiTree<T>::PreOrder(BiNode<T>*root)
資料結構第四次作業第二章
const int MaxSize=100; template class SeqList { public: SeqList(); SeqList(T a[],int n); ~SeqList(); int Length(){return length;} T Get(int i); in
資料結構C語言版(第二章迷宮)
轉自未空blog //我剛開始對STACK的記憶體分配那有點問題,後來用這個程式碼除錯了下,感覺有點明白了, 地址由高到低分配,然後程式碼中的base和top剛開始指向地址最低的地方,記憶體不夠時重新在原有基礎上新增記憶體,top指向原有的棧頂,然後繼續
資料結構第2章上機實驗題2.1
問題描述:實現順序表的基本運算(1-12具體要求見課本P62),作為對已經學過的順序表的小revision~ 原始碼: list.h: #include <stdio.h> #includ