指向結構體變量的指針與鏈表結構的關係應用


一、   一個結構體變量的指針就是該變量所佔據的內存段的起始地址。能夠設一個指針變量,用來指向一個結構體變量,此時該指針變量的值是結構體變量的其實地址。指針變量也能夠用來指向結構體數組的元素。ios

例如:聲明一個結構體Student類型,定義一個Student結構體類型變量stu,聲明一個Student指針*p指向stu的地址,咱們能夠經過stu調用Student結構體類型的成員變量,相應的,由於*p指向stu的內存的起始位置,因此咱們能夠經過調用*p來調用stu的成員變量,例如:(*p).name,(*p).age來賦值操做等等,注意*p的括號不可省略,由於成員運算符」.」優先級大於」*」。算法

二、   指向運算符數組

爲了使用方便直觀,C++提供了指向結構體變量的運算符->,例如:p->num表示指向p當前指向的結構體變量中的成員num。p->num和(*p).num等價。數據結構

總結:以下三種形式等價:ide

  結構體變量.成員名。如stu.numspa

  (*p).成員名。如:(*p).num.net

  p->成員名。如p->num。」->」稱爲指向運算符。設計

分析以下幾種運算:指針

 p->n:獲得p指向的結構體變量中的成員n的值orm

p->n++:獲得p指向的結構體變量中的成員

n的值,用完該值後使它加1.

++p->n:獲得p指向的結構體變量中的成員n的值,並使之加1而後再使用。

三、   用結構體變量和指向結構體變量的指針構成鏈表

a) 鏈表是一種常見的重要的數據結構

b) 鏈表有一個「頭指針「變量,用來存放一個地址。該地址指向一個元素。鏈表中的每個元素稱爲」結點「,每一個結點都應包括兩個部分:一是用戶須要用的實際數據,二是下一個結點的地址。最後一個元素再也不指向其餘元素,稱爲」表尾「,它的地址部分放一個」NULL「(空地址),鏈表到此結束。

c)  鏈表中各元素在內存中的存儲單元能夠是不連續的。查找元素能夠經過先後鏈表之間的關係查找,前一個鏈表的第二個元素的地址是下一個鏈表的第一個元素。

d) 這種鏈表的數據結構,必須利用結構體變量和指針才能實現。能夠聲明一個結構體類型,包含兩種成員,一種是用戶須要用的實際數據,另外一種是用來存放下一個結點地址的指針變量。例如:

struct Student

  { 

int num;

float score;

Student*next;

};

           其中成員num和score是用戶需用用到的數據,next是指針類型的成員,指向Student類型數據,用來存放下一個結點的地址。設計者沒必要知道各個結點的具體地址,只要保證能將下一個節點的地址放到前一個結點的成員next中便可。

創建並輸出一個簡單鏈表:

 /*

 *table.cpp

 *

 * Created on: 2012-4-8

 *     Author: David

 */

 

#define NULL 0

#include<iostream>

 

struct Student

{

  long num;

  float score;

  struct Student *next;

};

 

int main()

{

  Studenta,b,c,*head,*p;

  a.num=31001;a.score=89.5;//對結點anumscore成員賦值

  b.num=31003;b.score=90;//對結點bnumscore成員賦值

  c.num=31007;c.score=85;//對結點cnumscore成員賦值

  head=&a;     //將結點a的起始地址賦給頭指針head

  a.next=&b;   //將結點b的起始地址賦給a結點的next成員

  b.next=&c;   //將結點b的起始地址賦給b結點的next成員

  c.next=NULL;//結點的next成員不存放其餘結點地址

  p=head;     //p指針指向a結點

 

  do

  {

    cout<<p->num<<""<<p->score<<endl; //輸出p指向的結點的數據

    p=p->next;   //使p指向下一個結點

  }

  while(p!=NULL); //輸出完c結點後p的值爲NULL

  return 0;

}

 

開始時使head指向a結點,a.next指向b結點,b.next指向c結點,這就構成鏈表關係。第一行用#define命令定義了符號常量NULL表明0,在16行將0地址賦給c.next的做用是使c.next不指向任何有用的存儲單元。

四、   靜態鏈表:全部結點(結構體變量)都是在程序中定義的,不是臨時開闢的,也不用用完後釋放,這種鏈表稱爲靜態鏈表。

五、   動態鏈表:各結點是能夠隨時插入和刪除的,這些結點並無變量名,只能先找到上一個結點,才能根據它提供的下一結點的地址找到下一個結點。

六、   只提供第一個結點的地址叫作頭指針head,只有有了頭指針,鏈表才能訪問整個鏈表。

相關文章
相關標籤/搜索