考研數(shù)據(jù)結(jié)構(gòu)復(fù)習(xí)之線性表(二)

單鏈表的學(xué)習(xí)

#pragma once
typedef char DataType;
class SSeqListTest
{
public:
    SSeqListTest();
    ~SSeqListTest();
};
typedef struct Node {
    DataType data;
    struct  Node *next;
}ListNode,*LinkList;

void InitLinkList(LinkList *head);
bool IsLinkListEmpty(LinkList head);
ListNode *Get(LinkList head,int i);
ListNode *LocateElem(LinkList head,DataType e);
int LocatePosition(LinkList head,DataType e);
int InsertList(LinkList head,int i,DataType e);
int DeleteList(LinkList head,int i,DataType *e);
int ListLength(LinkList head);
void DestroyList(LinkList head);

完整的實(shí)現(xiàn)代碼如下:

#include "SSeqListTest.h"
#include<malloc.h>
#include<iostream>
using namespace std;


SSeqListTest::SSeqListTest()
{
}


SSeqListTest::~SSeqListTest()
{
}
/*這里初始化的函數(shù)為void InitLinkList(LinkList * head)佳谦;
它的參數(shù)為LinkList * head疙挺,相當(dāng)于int **P祭犯,
你需要理解透徹续崖,不理解透徹的話也可以參考之前的線性表的初始化:
線性表的初始化:
void InitList(SeqList * L)
{
    L->length = 0;
}
所以可以完全照搬映跟。
但是在考研的數(shù)據(jù)結(jié)構(gòu)中制作節(jié)點(diǎn)有兩種方式:
拿簡單的順序表舉例子:
(1)直接制作:SeqList L
(2)間接制作:SeqList *L世曾;
L=(SeqList *)malloc(sizeof(SeqList))裕循;
考研中第二種考查的比較多厚柳。
void InitLinkList(ListNode *head)
{
    if ((head=(LinkList)malloc(sizeof(ListNode)))==NULL)
    {
        exit(-1);
    }
    (head)->next = NULL;
    cout << "分配成功" << endl;
}*/
//但是實(shí)際上使用最多的初始化方式是下面這種抛寝,以后樹的章節(jié)你還會(huì)見到熊杨。
void InitLinkList(LinkList *head)
{
    if ((*head=(LinkList)malloc(sizeof(ListNode)))==NULL)
    {
        exit(-1);
    }
    (*head)->next = NULL;
    cout << "分配成功" << endl;
}

bool IsLinkListEmpty(LinkList head)
{
    if (head->next==NULL)
    {
        return true;
    }
    return false;
}
/*按照序號(hào)來查找元素操作*/
//這里需要注意的是返回的是i個(gè)位置的指針返回類型應(yīng)該寫成ListNode *、
//大家也都知道ListNode *L=LinkList L盗舰;
//所以自然也可以這樣寫:LinkList  Get(LinkList head, int i)
//兩者的效果是一樣的晶府,親自動(dòng)手一下就知道了。
//以下的函數(shù)返回時(shí)指針類型的同樣的解釋钻趋。

ListNode * Get(LinkList head, int i)
{
    ListNode *p; int j=0;
    if (IsLinkListEmpty(head))
    {
        return NULL;
    }
    else if(i<1){ 
        return NULL;
    }
    else
    {
        p = head;
        while (p->next!=NULL&&j<i)
        {
            p = p->next;
            j++;
        }
        if (j==i)
        {
            return p;
        }
        else
        {
            return NULL;
        }
    }
}
/*查找節(jié)點(diǎn)值為e的節(jié)點(diǎn)并返回所對(duì)應(yīng)的指針*/
ListNode *LocateElem(LinkList head, DataType e)
{
    ListNode *p;
    p = head->next;
    while (p)
    {
        if (p->data!=e)
        {
            p = p->next;
        }
        else
        {
            break;
        }   
    }
    return p;
}
//通過元素值定位位置川陆,缺點(diǎn)在于如果有兩個(gè)位置的數(shù)據(jù)值一樣,只能定位到前一個(gè)位置蛮位。
int LocatePosition(LinkList head, DataType e)
{
    ListNode *p;
    int i = 1;
    if (IsLinkListEmpty(head))
    {
        return -1;
    }
    p = head->next;
    while (p!=NULL)
    {
        if (p->data==e)
        {
            return i;
        }
        else
        {
            p = p->next;
            i++;
        }
    }
    if (p==NULL)
    {
        return -1;
    }
    else
    {
        return 1;
    }
}
/*在i的位置插入元素较沪,需要找到之前的i-1的指針*/
int InsertList(LinkList head, int i, DataType e)
{
    ListNode *pre, *p;
    pre = head;
    int j = 0;
    /*找到i-1個(gè)節(jié)點(diǎn)*/
    while (pre->next!=NULL&&j<i-1)
    {
        pre = pre->next;
        j++;
    }
    if (j!=i-1)
    {
        cout << "插入的節(jié)點(diǎn)位置有錯(cuò)" << endl;
        return -1;
    }
    if ((p=(ListNode*)malloc(sizeof(ListNode)))==NULL)
    {
        exit(-1);
    }
    p->data = e;
    p->next = pre->next;
    pre->next = p;
    return 1;

    
}
//根據(jù)位置刪除掉單鏈表中的元素。
int DeleteList(LinkList head, int i, DataType * e)
{
    ListNode *pre, *p;
    int j = 0;
    pre = head;
    while (pre->next != NULL&&pre->next->next!=NULL&&j<i-1)
    {
        pre = pre->next;
        j++;
    }
    if (j!=i-1)
    {
        cout << "刪除位置出錯(cuò)" << endl;
        return -1;
    }
    p = pre->next;
    *e = p->data;
    pre->next = p->next;
    /*釋放P節(jié)點(diǎn)指向的點(diǎn)*/
    free(p);
    return 1;
}
//得到單鏈表的長度失仁。
int ListLength(LinkList head)
{
    LinkList p;
    p = head;
    int count = 0;
    while (p->next!=NULL)
    {
        p = p->next;
        count++;
    }
    return count;
}
//銷毀單聊表
void DestroyList(LinkList head)
{
    ListNode *p,*q;
    p = head;
    while (p!=NULL)
    {
        q = p;
        p = p->next;
        free(q);
    }
}

測試函數(shù):

int main(){
    cout << "測試開始"<<endl;
    LinkList L;
    InitLinkList(&L);
    InsertList(L,1,'a');
    cout << "單鏈表長度" << ListLength(L)<<endl;
    LinkList getElumByNum;
    getElumByNum = Get(L, 1);
    cout <<"第一個(gè)位置元素是:"<< getElumByNum->data << endl;
    DataType deleteElumValue;
    DeleteList(L,1,&deleteElumValue);
    cout << deleteElumValue << endl;
    cout << "單鏈表長度" << ListLength(L) << endl;
    system("PAUSE");
    return 0;
}

運(yùn)行結(jié)果:


這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尸曼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子萄焦,更是在濱河造成了極大的恐慌控轿,老刑警劉巖冤竹,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茬射,居然都是意外死亡鹦蠕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門在抛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钟病,“玉大人,你說我怎么就攤上這事刚梭〕澹” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵望浩,是天一觀的道長辖所。 經(jīng)常有香客問我,道長磨德,這世上最難降的妖魔是什么缘回? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮典挑,結(jié)果婚禮上酥宴,老公的妹妹穿的比我還像新娘。我一直安慰自己您觉,他們只是感情好拙寡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳水,像睡著了一般肆糕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上在孝,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天诚啃,我揣著相機(jī)與錄音,去河邊找鬼私沮。 笑死始赎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仔燕。 我是一名探鬼主播造垛,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晰搀!你這毒婦竟也來了五辽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤外恕,失蹤者是張志新(化名)和其女友劉穎奔脐,沒想到半個(gè)月后俄周,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡髓迎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了建丧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排龄。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翎朱,靈堂內(nèi)的尸體忽然破棺而出橄维,到底是詐尸還是另有隱情,我是刑警寧澤拴曲,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布争舞,位于F島的核電站,受9級(jí)特大地震影響澈灼,放射性物質(zhì)發(fā)生泄漏竞川。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一叁熔、第九天 我趴在偏房一處隱蔽的房頂上張望委乌。 院中可真熱鬧,春花似錦荣回、人聲如沸遭贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壕吹。三九已至,卻和暖如春删铃,著一層夾襖步出監(jiān)牢的瞬間耳贬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工泳姐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留效拭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓胖秒,卻偏偏與公主長得像缎患,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阎肝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評(píng)論 25 707
  • 轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/ac8d278cf469 上一篇《數(shù)據(jù)結(jié)構(gòu)與算法...
    Alent閱讀 2,196評(píng)論 3 22
  • 大學(xué)的時(shí)候不好好學(xué)習(xí)风题,老師在講臺(tái)上講課判导,自己在以為老師看不到的座位看小說嫉父,現(xiàn)在用到了老師講的知識(shí),只能自己看書查資...
    和玨貓閱讀 1,435評(píng)論 1 3
  • 夜里十一點(diǎn)眼刃,立早還在忙著趕路绕辖。 白燈籠搖曳著微弱的燭光,立早一個(gè)人在趕路擂红。 立早必須要在今天結(jié)束前見到她仪际,因?yàn)榱璩?..
    丶丨沖浪里閱讀 191評(píng)論 0 0
  • 青春從我的心上 傳到你的手上 你拉著我的衣裳 我看著你的臉龐 你叫光 我叫亮
    骨道閱讀 76評(píng)論 0 0