打開“鏈表.cpp”檔案,將代碼中三個TODO按下列要求填充完整
一、填充函式ShowList實作將單鏈表的所有元素輸出出來。
二、填充函式ListLength實作單鏈表的求表長操作,回傳鏈表的表長。
三、主函式:
1) 建立一個包括頭結點和6個結點的(1,2,3,4,5,6)的單鏈表,實作單鏈表建立的基本操作。
2) 將該單鏈表的所有元素顯示輸出來。
3) 在已建好的單鏈表中的指定位置(i=3)插入一個結點99,實作單鏈表插入的基本操作,并將該單鏈表的所有元素顯示出來
4) 在單鏈表的指定位置(如i=2)洗掉一個結點,實作單鏈表洗掉的基本操作。將該單鏈表的所有元素顯示出來
5)輸出該單鏈表的表長。
6)在單鏈表中查找5和99
#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函式回傳值型別,其值是函式結果狀態代碼。
typedef int ElemType; //ElemType 為可定義的資料型別,此設為int型別
typedef struct LNode {
ElemType data; //結點的資料域
struct LNode *next; //結點的指標域
} LNode, *LinkList; //LinkList為指向結構體LNode的指標型別
Status InitList(LinkList &L) { //演算法2.6 單鏈表的初始化
//構造一個空的單鏈表L
L = new LNode; //生成新結點作為頭結點,用頭指標L指向頭結點
L->next = NULL; //頭結點的指標域置空
return OK;
}
Status GetElem(LinkList L, int i, ElemType &e) { //演算法2.7 單鏈表的取值
//在帶頭結點的單鏈表L中查找第i個元素
//用e回傳L中第i個資料元素的值
int j;
LinkList p;
p = L->next;
j = 1; //初始化,p指向第一個結點,j為計數器
while (j < i && p) { //順鏈域向后掃描,直到p指向第i個元素或p為空
p = p->next; //p指向下一個結點
++j; //計數器j相應加1
}
if (!p || j > i)
return ERROR; //i值不合法i>n或i<=0
e = p->data; //取第i個結點的資料域
return OK;
} //GetElem
LNode *LocateElem(LinkList L, ElemType e) { //演算法2.8 按值查找
//在帶頭結點的單鏈表L中查找值為e的元素
LinkList p;
p = L->next;
while (p && p->data != e)//順鏈域向后掃描,直到p為慷訓p所指結點的資料域等于e
p = p->next; //p指向下一個結點
return p; //查找成功回傳值為e的結點地址p,查找失敗p為NULL
} //LocateElem
Status ListInsert(LinkList &L, int i, ElemType e) { //演算法2.9 單鏈表的插入
//在帶頭結點的單鏈表L中第i個位置插入值為e的新結點
int j;
LinkList p, s;
p = L;
j = 0;
while (p && j < i - 1) {
p = p->next;
++j;
}//查找第i?1個結點,p指向該結點
if (!p || j > i - 1)
return ERROR; //i>n+1或者i<1
s = new LNode; //生成新結點*s
s->data = e; //將結點*s的資料域置為e
s->next = p->next; //將結點*s的指標域指向結點ai
p->next = s; //將結點*p的指標域指向結點*s
return OK;
} //ListInsert
Status ListDelete(LinkList &L, int i) { //演算法2.9 單鏈表的洗掉
//在帶頭結點的單鏈表L中,洗掉第i個位置
LinkList p, q;
int j;
p = L;
j = 0;
while ((p->next) && (j < i - 1)) //查找第i?1個結點,p指向該結點
{
p = p->next;
++j;
}
if (!(p->next) || (j > i - 1))
return ERROR; //當i>n或i<1時,洗掉位置不合理
q = p->next; //臨時保存被刪結點的地址以備釋放
p->next = q->next; //改變洗掉結點前驅結點的指標域
delete q; //釋放洗掉結點的空間
return OK;
} //ListDelete
void CreateList_H(LinkList &L, int n) { //演算法2.11 前插法創建單鏈表
//逆位序輸入n個元素的值,建立到頭結點的單鏈表L
LinkList p;
int i;
L = new LNode;
L->next = NULL; //先建立一個帶頭結點的空鏈表
for(i=0;i<n;i++)
{
p = new LNode; //生成新結點*p
cin >> p->data; //輸入元素值賦給新結點*p的資料域
p->next = L->next;
L->next = p; //將新結點*p插入到頭結點之后
}
} //CreateList_H
void CreateList_R(LinkList &L, int n) { //演算法2.12 后插法創建單鏈表
//正位序輸入n個元素的值,建立帶表頭結點的單鏈表L
LinkList p, r;
int i;
L = new LNode;
L->next = NULL; //先建立一個帶頭結點的空鏈表
r = L; //尾指標r指向頭結點
for(i=0;i<n;i++)
{
p = new LNode;//生成新結點
cin >> p->data ;//輸入元素值賦給新結點*p的資料域
p->next = NULL;
r->next = p;//將新結點*p插入尾結點*r之后
r = p;//r指向新的尾結點*p
}
} //CreateList_R
void ShowList(LinkList L)
{//將該單鏈表的所有元素顯示出來
//TODO
}
int ListLength(LinkList L)
{//實作單鏈表的求表長操作
//TODO
}
int main() {
//TODO
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/95857.html
標籤:C++ 語言
