一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

(11)C++鏈表的創(chuàng)建與操作

 xubin2016 2016-11-11
    我們知道,數(shù)組式計算機根據(jù)事先定義好的數(shù)組類型與長度自動為其分配一連續(xù)的存儲單元,相同數(shù)組的位置和距離都是固定的,也就是說,任何一個數(shù)組元素的地址都可一個簡單的公式計算出來,因此這種結(jié)構(gòu)可以有效的對數(shù)組元素進行隨機訪問。但若對數(shù)組元素進行插入和刪除操作,則會引起大量數(shù)據(jù)的移動,從而使簡單的數(shù)據(jù)處理變得非常復雜,低效。
為了能有效地解決這些問題,一種稱為“鏈表”的數(shù)據(jù)結(jié)構(gòu)得到了廣泛應(yīng)用。
1. 鏈表概述
鏈表是一種動態(tài)數(shù)據(jù)結(jié)構(gòu),他的特點是用一組任意的存儲單元(可以是連續(xù)的,也可以是不連續(xù)的)存放數(shù)據(jù)元素。
鏈表中每一個元素成為“結(jié)點”,每一個結(jié)點都是由數(shù)據(jù)域和指針域組成的,每個結(jié)點中的指針域指向下一個結(jié)點。Head是“頭指針”,表示鏈表的開始,用來指向第一個結(jié)點,而最后一個指針的指針域為NULL(空地址),表示鏈表的結(jié)束。
可以看出鏈表結(jié)構(gòu)必須利用指針才能實現(xiàn),即一個結(jié)點中必須包含一個指針變量,用來存放下一個結(jié)點的地址。
實際上,鏈表中的每個結(jié)點可以用若干個數(shù)據(jù)和若干個指針。結(jié)點中只有一個指針的鏈表稱為單鏈表,這是最簡單的鏈表結(jié)構(gòu)。
再c++中實現(xiàn)一個單鏈表結(jié)構(gòu)比較簡單。例如,可定義單鏈表結(jié)構(gòu)的最簡單形式如下
struct Node
{
int Data;
Node*next;
};
這里用到了結(jié)構(gòu)體類型。其中,*next是指針域,用來指向該結(jié)點的下一個結(jié)點;Data是一個整形變量,用來存放結(jié)點中的數(shù)據(jù)。當然,Data可以是任何數(shù)據(jù)類型,包括結(jié)構(gòu)體類型或類類型。
在此基礎(chǔ)上,我們在定義一個鏈表類list,其中包含鏈表結(jié)點的插入,刪除,輸出等功能的成員函數(shù)。

class list
{
Node*head;
public:
list(){head=NULL;}
void insertlist(int aDate,int bDate);//鏈表結(jié)點的插入
void Deletelist(int aDate);//鏈表結(jié)點的刪除
void Outputlist();//鏈表結(jié)點的輸出
Node*Gethead(){return head;}
};
2. 鏈表結(jié)點的訪問
由于鏈表中的各個結(jié)點是由指針鏈接在一起的,其存儲單元文筆是連續(xù)的,因此,對其中任意結(jié)點的地址無法向數(shù)組一樣,用一個簡單的公式計算出來,進行隨機訪問。只能從鏈表的頭指針(即head)開始,用一個指針p先指向第一個結(jié)點,然后根據(jù)結(jié)點p找到下一個結(jié)點。以此類推,直至找到所要訪問的結(jié)點或到最后一個結(jié)點(指針為空)為止。
下面我們給出上述鏈表的輸出函數(shù);
void list::outputlist()
{
Node*current=head;
while(current!=NULL)
{
cout<<current->Data<<" ";
current=current->next;
}
cout<<endl;
}
3. 鏈表結(jié)點的插入
如果要在鏈表中的結(jié)點a之前插入結(jié)點b,則需要考慮下面幾點情況。
(1) 插入前鏈表是一個空表,這時插入新結(jié)點b后。
(2) 若a是鏈表的第一個結(jié)點,則插入后,結(jié)點b為第一個結(jié)點。
(3) 若鏈表中存在a,且不是第一個結(jié)點,則首先要找出a的上一個結(jié)點a_k,然后使a_k的指針域指向b,在令b的指針域指向a,即可完成插入。
(4) 如鏈表中不存在a,則插在最后。先找到鏈表的最后一個結(jié)點a_n,然后使a_n的指針域指向結(jié)點b,而b指針的指針為空。
以下是鏈表類的結(jié)點插入函數(shù),顯然其也具有建立鏈表的功能。
void list::insertlist(int aDate,int bDate) //設(shè)aDate是結(jié)點a中的數(shù)據(jù),bDate是結(jié)點b中的數(shù)據(jù)
{
       Node*p,*q,*s; //p指向結(jié)點a,q指向結(jié)點a_k,s指向結(jié)點b
       s=(Node*)new(Node); //動態(tài)分配一個新結(jié)點
       s->Data=bDate; //設(shè)b為此結(jié)點 
       p=head;
      if(head==NULL) //若是空表,使b作為第一個結(jié)點
        {
            head=s;
            s->next=NULL; 
         }
       else
            if(p->Data==aDate) //若a是第一個結(jié)點
               {
                  s->next=p;
                  head=s; 
               }
            else
              {
                  while(p->Data!=aDate&&p->next!=NULL)//查找結(jié)點a
                    {
                            q=p;
                             p=p->next;
                     }
                   if(p->Data==aDate) ///若有結(jié)點a
                    {
                          q->next=s;
                           s->next=p; 
                    
                     else //若沒有結(jié)點a;
                   {
                          p->next=s;
                           s->next=NULL; 
                    }
             }
}
4. 鏈表結(jié)點的刪除
如果要在鏈表中刪除結(jié)點a并釋放被刪除的結(jié)點所占的存儲空間,則需要考慮下列幾種情況。
(1) 若要刪除的結(jié)點a是第一個結(jié)點,則把head指向a的下一個結(jié)點。
(2) 若要刪除的結(jié)點a存在于鏈表中,但不是第一個結(jié)點,則應(yīng)使a得上一個結(jié)點a_k-1的指針域指向a的下一個結(jié)點a_k+1。
(3) 空表或要刪除的結(jié)點a不存在,則不做任何改變。
以下是鏈表類的結(jié)點刪除函數(shù)。
void list::deletelist(int aDate) //設(shè)aDate是要刪除的結(jié)點a中的數(shù)據(jù)成員
{
Node*p,*q; //p用于指向結(jié)點a,q用于指向結(jié)a的前一個結(jié)點
p=head;
if(p==NULL) //若是空表
return;
if(p->Data==aDate) //若a是第一個結(jié)點
{
head=p->next;
delete p;
}
else
{
while(p->Data!=aDate&&p->next!=NULL) //查找結(jié)點a
{
q=p;
p=p->next;
}
if(p->Data==aDate) //若有結(jié)點a
{
q->next=p->next;
delete p;
}
}
}
例題;利用以上三個鏈表操作成員函數(shù)insertlist,deletelist.outputlist,可形成以下的簡單鏈表操作程序。
#include"iostream.h"
struct Node
{
int Data;
Node*next;
};
class list
{
Node*head;
public:
list(){head=NULL;}
void insertlist(int aData,int bData);
void deletelist(int aData);
void outputlist();
Node*gethead(){return head;}
};

void list::insertlist(int aData,int bData) //設(shè)aData是結(jié)點a中的數(shù)據(jù),bData是結(jié)點b中的數(shù)據(jù)
{
Node*p,*q,*s; //p指向結(jié)點a,q指向結(jié)點a_k,s指向結(jié)點b
s=(Node*)new(Node); //動態(tài)分配一個新結(jié)點
s->Data=bData; //設(shè)b為此結(jié)點
p=head;
if(head==NULL) //若是空表,使b作為第一個結(jié)點
{
head=s;
s->next=NULL;
}
else
if(p->Data==aData) //若a是第一個結(jié)點
{
s->next=p;
head=s;
}
else
{
while(p->Data!=aData && p->next!=NULL)//查找結(jié)點a
{
q=p;
p=p->next;
}
if(p->Data==aData) ///若有結(jié)點a
{
q->next=s;
s->next=p;
}
else //若沒有結(jié)點a;
{
p->next=s;
s->next=NULL;
}
}
}
void list::deletelist(int aData) //設(shè)aData是要刪除的結(jié)點a中的數(shù)據(jù)成員
{
Node*p,*q; //p用于指向結(jié)點a,q用于指向結(jié)a的前一個結(jié)點
p=head;
if(p==NULL) //若是空表
return;
if(p->Data==aData) //若a是第一個結(jié)點
{
head=p->next;
delete p;
}
else
{
while(p->Data!=aData&&p->next!=NULL) //查找結(jié)點a
{
q=p;
p=p->next;
}
if(p->Data==aData) //若有結(jié)點a
{
q->next=p->next;
delete p;
}
}
}
void list::outputlist()
{
Node*current=head;
while(current!=NULL)
{
cout<<current->Data<<" ";
current=current->next;
}
cout<<endl;
}
void main()
{
list A,B;
int Data[10]={25,41,16,98,5,67,9,55,1,121};
A.insertlist(0,Data[0]); //建立鏈表A首結(jié)點
for(int i=1;i<10;i++)
A.insertlist(0,Data[i]); //順序向后插入
cout<<"\n鏈表A:";
A.outputlist();
A.deletelist(Data[7]);
cout<<"刪除元素Data[7]后";
A.outputlist();
B.insertlist(0,Data[0]); //建立鏈表B首結(jié)點
for(i=0;i<10;i++)
B.insertlist(B.gethead()->Data,Data[i]); //在首結(jié)點處順序向后插入
cout<<"\n鏈表B:";
B.outputlist();
B.deletelist(67);
cout<<"刪除元素67后";
B.outputlist();
}
程序運行結(jié)果為
鏈表A;25,41,16,98,5,67,9,55,1,121
刪除元素Data[7]后;
25,41,16,98,5,67,9,1,121
鏈表B;121,1,55,9,67,5,98,16,41,25,
刪除元素67后;
121,1,55,9,5,98,16,41,25,

下面是楊輝三角的代碼:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
const int n=11;
int i,j,a[n][n];
for(i=1;i<n;i++)
{
a[i][i]=1;
a[i][1]=1;
}
for(i=3;i<n;i++)
{
for(j=2;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
for(i=1;i<n;i++)
{
for(j=1;j<=i;j++)
cout<<setw(5)<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
return 0;
}

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产成人免费激情视频| 女生更色还是男生更色| 好东西一起分享老鸭窝| 91人妻人人精品人人爽| 日韩特级黄色大片在线观看| 国产精品日韩欧美第一页| 亚洲免费视频中文字幕在线观看 | 乱女午夜精品一区二区三区| 国产在线一区二区免费| 高跟丝袜av在线一区二区三区| 成年人免费看国产视频| 精品女同一区二区三区| 亚洲精品日韩欧美精品| 日韩熟妇人妻一区二区三区| 日韩高清一区二区三区四区 | 日韩成人高清免费在线| 黄色国产自拍在线观看| 国产精品熟女乱色一区二区| 国产精品免费无遮挡不卡视频| 国产亚州欧美一区二区| 亚洲精品一二三区不卡| 久久热麻豆国产精品视频| 国产一区二区三区免费福利| 国产成人av在线免播放观看av| 欧美日韩国产免费看黄片| 熟女高潮一区二区三区| 亚洲欧美日韩另类第一页| 亚洲欧美黑人一区二区| 亚洲最新的黄色录像在线| 亚洲精品福利入口在线| 九九九热视频免费观看| 五月情婷婷综合激情综合狠狠| 91精品视频免费播放| 亚洲超碰成人天堂涩涩| 欧美自拍偷自拍亚洲精品| 69老司机精品视频在线观看| 亚洲视频一区二区久久久| 成人免费高清在线一区二区| 欧美色欧美亚洲日在线| 日本加勒比不卡二三四区| 国产日韩欧美一区二区|