計算機等級考試二級C語言單鏈表的建立與算

2022-03-29 20:42:22 字數 2917 閱讀 4282

一、單鏈表的建立

有了動態記憶體分配的基礎,要實現鍊錶就不難了。

所謂鍊錶,就是用一組任意的儲存單元儲存線性表元素的一種資料結構。鍊錶又分為單鏈表、雙向鍊錶和迴圈鍊錶等。我們先講講單鏈表。所謂單鏈表,是指資料接點是單向排列的。乙個單鏈表結點,其結構型別分為兩部分:

1、資料域:用來儲存本身資料

2、鏈域或稱為指標域:用來儲存下乙個結點位址或者說指向其直接後繼的指標。

例:typedef struct node

stud;

這樣就定義了乙個單鏈表的結構,其中char name[20]是乙個用來儲存姓名的字元型陣列,指標*link是乙個用來儲存其直接後繼的指標。

定義好了鍊錶的結構之後,只要在程式執行的時候愛資料域中儲存適當的資料,如有後繼結點,則把鏈域指向其直接後繼,若沒有,則置為null。

下面就來看乙個建立帶表頭(若未說明,以下所指鍊錶均帶表頭)的單鏈表的完整程式。

#include <stdio.h>

#include <malloc.h> /*包含動態記憶體分配函式的標頭檔案*/

#define n 10 /*n為人數*/

typedef struct node

stud;

stud * creat(int n) /*建立單鏈表的函式,形參n為人數*/

h->name[0]= ; /*把表頭結點的資料域置空*/

h->link=null; /*把表頭結點的鏈域置空*/

p=h; /*p指向表頭結點*/

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

p->link=s; /*把s的位址賦給p所指向的結點的鏈域,這樣就把p和s所指向的結點連線起來了*/

printf("請輸入第%d個人的姓名",i+1);

scanf("%s",s->name); /*在當前結點s的資料域中儲存姓名*/

s->link=null;

p=s;

} return(h);

} main()

這樣就寫好了乙個可以建立包含n個人姓名的單鏈表了。寫動態記憶體分配的程式應注意,請盡量對分配是否成功進行檢測。

[1] [2] [3] 下一頁

二、單鏈表的查詢運算  建立了乙個單鏈表之後,如果要進行一些如插入、刪除等操作該怎麼辦?所以還須掌握一些單鏈表的基本演算法,來實現這些操作。單鏈表的基本運算包括:查詢、插入和刪除。下面我們就一一介紹這三種基本運算的演算法,並結合我們建立單鏈表的例子寫出相應的程式。

1、查詢

對單鏈表進行查詢的思路為:對單鏈表的結點依次掃瞄,檢測其資料域是否是我們所要查好的值,若是返回該結點的指標,否則返回null。

因為在單鏈表的鏈域中包含了後繼結點的儲存位址,所以當我們實現的時候,只要知道該單鏈表的頭指標,即可依次對每個結點的資料域進行檢測。

以下是應用查詢演算法的乙個例子:

#include <stdio.h>

#include <malloc.h>

#include <string.h> /*包含一些字串處理函式的標頭檔案*/

#define n 10

typedef struct node

stud;

stud * creat(int n) /*建立鍊錶的函式*/

h->name[0]= ;

h->link=null;

p=h;

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

p->link=s;

printf("請輸入第%d個人的姓名",i+1);

scanf("%s",s->name);

s->link=null;

p=s;

} return(h);

}stud * search(stud *h,char *x) /*查詢鍊錶的函式,其中h指標是鍊錶的表頭指標,x指標是要查詢的人的姓名*/

if(p==null)

printf("沒有查詢到該資料!");

}main()

stud;

stud * creat(int n) /*建立單鏈表的函式*/

h->name[0]= ;

h->link=null;

p=h;

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

p->link=s;

printf("請輸入第%d個人的姓名:",i+1);

scanf("%s",s->name);

s->link=null;

p=s;

} return(h);

}stud * search(stud *h,char *x) /*查詢函式*/

if(p==null)

printf("沒有查詢到該資料!");

}void insert(stud *p) /*插入函式,在指標p後插入*/

printf("請輸入你要插入的人的姓名:");

scanf("%s",stuname);

strcpy(s->name,stuname); /*把指標stuname所指向的陣列元素拷貝給新結點的資料域*/

s->link=p->link; /*把新結點的鏈域指向原來p結點的後繼結點*/

p->link=s; /*p結點的鏈域指向新結點*/

}main()

{ int number;

char fullname[20]; /*儲存輸入的要查詢的人的姓名*/

stud *head,*searchpoint;

number=n;

head=creat(number); /*建立新鍊錶並返回表頭指標*/

printf("請輸入你要查詢的人的姓名:");

scanf("%s",fullname);

searchpoint=search(head,fullname); /*查詢並返回查詢到的結點指標*/

insert(searchpoint); /*呼叫插入函式*/

上一頁  [1] [2] [3]

全國計算機等級考試 C語言二級 題庫

1 下列敘述中正確的是 a 乙個演算法的空間複雜度大,則其時間複雜度也必定大 b 乙個演算法的空間複雜度大,則其時間複雜度必定小 c 乙個演算法的時間複雜度大,則其空間複雜度必定小 d 演算法的時間複雜度與空間複雜度沒有直接關係 正確答案 d 解析 演算法的空間複雜度是指演算法在執行過程中所需要 的...

計算機等級考試二級c語言概念複習三

計算機等級考試二級c語言概念複習三 21.樹形結點的集合,它的根結點數目是0或1 22.資料庫是乙個結構化的資料集合 23.需求分析的最終結果是產生需求規格說明書 24.假設線性表的長度為n,則在最壞的情況下,氣泡排序需要的比較次數是n n 1 2 25.乙個關係中的屬性個數為1時,稱此關係為一元關...

計算機等級考試二級C語言 迴圈控制語句

迴圈控制結構 又稱重複結構 是程式中的另乙個基本結構。在實際問題中,常常需要進行大量的重複處理,迴圈結構可以使我們只寫很少的語句,而讓計算機反覆執行,從而完成大量類同的計算。c語言提供了while語句 do.while語句和for語句實現迴圈結構。3.4.1while語句 while語句是當型迴圈控...