中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++培訓:C語言鏈接表分析

發布時間:2020-07-23 09:00:39 來源:網絡 閱讀:315 作者:IT大贏家 欄目:編程語言

  C++培訓之前有同學再問C語言鏈接表怎么破?今天小編把這個知識點給大家分享出來,有疑問的可以多看看!

  C++培訓:C語言鏈接表分析

  相信學了c語言的人對鏈表或多或少有了解,鏈表也是數據結構的重要內容,今天就來聊聊最簡單的單向動態鏈表的建立與輸出。首先要了解什么是鏈表,鏈表是程序設計中一種重要的動態數據結構,是動態地進行存儲分配的一種結構。其中動態主要表現在元素位置可以變化,即隨意刪除隨意插入等;元素個數可增可減,不像數組聲明后長度就固定不變了。這就想起前段時間有人在群里問怎么刪除素組中任意一個元素,如果沒有鏈表剛開始學感覺就會無從下手了,這里有段代碼大家可以看看:

  #include

  int main()

  {

  int a[6]={1,2,3,4,5,6};

  int n,i,j;

  printf("輸入要刪除的數:");

  scanf("%d",&n);

  for(i=0;i<6;i++)

  if(a[i]==n)

  {

  for(j=i;j<6-1;j++)

  a[j]=a[j+1];

  }

  for(i=0;i<6-1;i++)

  printf("%d\n",a[i]);

  return 0;

  }

  運行結果如下:

  C++培訓:C語言鏈接表分析

  是使數組元素從被刪除位置后面依次前移一位,然而最后一個元素依然存在,大家可以自己動手試試,這樣并沒有節約內存,然而鏈表刪除就不同了。所謂動態通俗的說就是用了就開辟空間,不用就釋放空間。動態存儲分配的函數主要有(malloc(),calloc(),realloc(),free())大家有興趣可以自己了解。然后就是看怎么樣建立鏈表了,第一步我們了解鏈表中的元素叫節點,每個節點包含數據域和指針域這兩部分。這個節點數據域可以包含很多方面的信息,這就要用到前面的結構體,數據域很容易理解,指針域就是存放下一個節點的指針即地址,這樣就建立好了每個節點之間的聯系。第二步來定義鏈表的節點,這時候我們要明白一點這個結構體的定義打破了c語言中的先定義在使用的限制,即可以用自己定義自己,這樣的例子還有遞歸函數的定義也是這樣。既然要指向下個節點的指針,那么結構體的成員必須包含指針變量,這個指針變量即可以指向其他類型的結構體數據,也可以指向自己所在的結構體類型數據。例:

  struct st

  {

  int num;

  char name[20];/*也可以寫為 char *name這樣可以不限長度,但編譯器不同可能不能給這個分配空間,所以這里用字符數組*/

  struct st *next;//next是struct st類型中的一員,它又指向struct st類型數據。

  };

  其中節點中的數據根據需要自己定義;

  第三步就是創建鏈表,大家肯定在想最后一個節點(尾節點)咋辦呢?既然是最后一個節點肯定沒有指向了,所以這里指向NULL(空指針:即不指向任何位置);有尾節點就有頭節點,所以我們可以規定一個頭指針head(這個指針名字可以隨意定義,不是指定的),來指向鏈表頭;定義函數struct st *creat(void)來創建鏈表;這里我們要定義三個struct st結構體指針變量,如下:

  Struct st *head,*p1,*p2; /*head頭指針,p1指向新節點,p2指向尾節點*/

  先用動態存儲非配函數malloc()為p1,p2開辟空間,p1=p2= (struct st *)malloc(sizeof(struct st));

  然后創建一個新節點,使head,p1,p2指向該節點;定義全局變量n判斷是否該指向表頭,此外還要設置一個節點為尾節點的標志,這里設置num==0;

  再創建二個新節點,p1指向新節點,將第二個節點放在第一個節點后面p2->next=p1;

  使第二個節點成為表尾;然后以后依次這樣走建立節點的聯系,直到輸入num為0時最后一個節點p2->next=NULL;這里要主意最后一個節點的數據項即數據域是沒進入鏈表的;

  最后就是定義void print(struct st *head)函數輸出:先找到頭指針然后格式輸出該節點數據項,定義Struct st *p;使p=head;然后指針后移:p=p->next;這里怎么判斷是否輸出結束,這就樣用到循環判斷了,這里我選擇do while;這樣main()函數中調用以上兩個函數程序就執行了,簡單的鏈表創建,輸出就結束了。下面是代碼:

  #include

  #include

  struct st

  {

  int num;

  char name[20];

  float score;

  struct st *next;

  };

  int n;

  struct st *creat(void)

  {

  struct st *head,*p1,*p2;

  n=0;

  p1=p2=(struct st *)malloc(sizeof(struct st));

  scanf("%d%s%f",&p1->num,p1->name,&p1->score);

  head=NULL;

  while(p1->num!=0)

  {

  n=n+1;

  if(n==1)head=p1;

  else (p2->next)=p1;

  p2=p1;

  p1=(struct st *)malloc(sizeof(struct st));

  scanf("%d%s%f",&p1->num,p1->name,&p1->score);

  }

  (p2->next)=NULL;

  return head;

  }

  void print(struct st *head)

  {

  struct st *p;

  p=head;

  if(head!=NULL)

  do

  {

  printf("%d\t%s\t%f\n",p->num,p->name,p->score);

  p=p->next;

  }while(p!=NULL);

  }

  void main()

  {

  struct st *head;

  head=creat();

  print(head);

  }

  運行結果如下:

  C++培訓:C語言鏈接表分析

  關于C語言作用域的兩個例子

  第一個例子:#include

  int a=0; // 全局變量

  void foo(void);

  int main(void) {

  int a=2; // main函數內的局部變量

  int b=3; // main函數內的局部變量

  printf("1. main_b = %d\n", b);

  printf("main_a = %d\n", a);

  foo();

  printf("2. main_b = %d\n", b);

  }

  void foo(void){

  int b=4; // foo函數內的局部變量

  printf("foo_a = %d\n", a);

  printf("foo_b = %d\n", b);

  }輸出結果:1. main_b = 3main_a = 2foo_a = 0foo_b = 42. main_b = 3第二個例子:#include

  int x = 2;

  int y = 3;

  int z = 4;

  void moo(int x, int *y){

  int z;

  x = x+3;

  *y = *y+3;

  z = z+3;

  /**

  * 這里的 z 是局部變量。

  * 注意:z 沒有被手動初始化。

  * 不過從后面的輸出結果可以看出,z 被編譯器自動初始化為 0。

  * 一般情況下,編譯器會有一個警告,告訴你 z 沒有被初始化

  **/

  printf("moo : x = %1d, *y = %1d, y = %1d, z = %1d\n", x,*y,y,z);

  }

  int main(void){

  moo(x, &y);

  printf("main: x = %1d1, y = %1d, z = %1d\n", x,y,z);

  }輸出結果:moo : x = 5, *y = 6, y = 1073742056, z = 3main: x = 21, y = 6, z = 4


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

十堰市| 萍乡市| 涞水县| 桃源县| 武夷山市| 大石桥市| 福鼎市| 承德市| 麻江县| 平舆县| 连江县| 宿迁市| 南华县| 新乐市| 巩留县| 邵阳市| 清涧县| 宣威市| 清流县| 外汇| 宁都县| 新密市| 威信县| 连云港市| 崇义县| 南平市| 余姚市| 丹阳市| 沙河市| 溧水县| 仁化县| 特克斯县| 久治县| 金沙县| 三明市| 卓尼县| 西青区| 竹北市| 福贡县| 临湘市| 邛崃市|