堆是用來存儲動態(tài)數(shù)據(jù)的。動態(tài)數(shù)據(jù)最典型的例子就是鏈表。
形象的說:將若干個數(shù)據(jù)項按一定的原則前后鏈接起來,沒有數(shù)據(jù)項都有一個指向下一個數(shù)據(jù)的指針,則這些數(shù)據(jù)項靠指針鏈成一個表,最后的一個數(shù)據(jù)沒有指針(指針為NULL),這就是鏈表?梢钥闯鲦湵矸旁诖鎯ζ髦校⒉灰欢ㄏ髷(shù)組一樣,連續(xù)存放,也可以分開存放。由于鏈的各節(jié)點均帶有指向下一個節(jié)點的地址,因而要找到某個節(jié)點,必須要找到上一個節(jié)點,如此類推,則可由第一個節(jié)點出發(fā)找到目的點。鏈表在數(shù)據(jù)庫建立和管理中用得比較普遍。
鏈表中的每個節(jié)點都具有相同的結(jié)構(gòu)類型,它們是由兩部分組成,即數(shù)據(jù)部分(它們包含一些有用的信息),另一部分就是鏈的指針。下面就定義一個通信鏈節(jié)點的數(shù)據(jù)結(jié)構(gòu):
struct address
{
char name[30];
char street[40];
char city[20];
char state[10];
char zip[6];
struct address *next; /*pointer to next entry*/
}list_entry;
該結(jié)構(gòu)中前五個成員是該節(jié)點的信息部分,最后一個成員是指向同一個結(jié)構(gòu)類型的指針。即next又指向一個同樣結(jié)構(gòu)類型的節(jié)點。
1.建立鏈表
建立鏈表時,首先要將第一個節(jié)點的內(nèi)容存入堆中,為此要將堆中能存入該節(jié)點內(nèi)容的內(nèi)存區(qū)域首地址賦給一個指針。我們可以用malloc()函數(shù)來分配內(nèi)存區(qū)域。如info是一個指針:
info=(struct address *)malloc(sizeof(list_entry));
當?shù)谝粋節(jié)點存入有info指出的內(nèi)存區(qū)后,再執(zhí)行該函數(shù),便得到狹義個節(jié)點的存儲地址info,此時將該info賦給上一個節(jié)點的next,并將該節(jié)點內(nèi)容存入info指出的內(nèi)存區(qū),這樣兩個節(jié)點就鏈接起來了。此過程反復(fù)多次,就可不斷的將節(jié)點加入鏈表的尾端。
#include stdlib.h
#include alloc.h
#include stdio.h
#include string.h
struct address
{
char name[30];
char street[40];
char city[20];
char state[10];
char zip[6];
struct address *next;
}list_entry;
void inputs(char *,char *,int);
void dls_store(struct address*);
main()
{
struct address *info;
int i;
for(i=0;i<5;i++)
{
info=(struct address *)malloc(sizeof(list_entry));
inputs(enter name:,info->name,30);
inputs(enter street:,info->street,40);
inputs(enter city:,info->city,20);
inputs(enter state:,info->state,10);
inputs(enter zip:,info->zip,6);
dls_store(info);
}
}
void inputs(char *prompt,char *s,int count)
{
char p[255];
do
{
printf(prompt);
gets(p);
if(strlen(p)>count) printf(\n too long \n);
}
while(strlen(p)>count);
strcpy(s,p);
}
void dls_store(struct address *in)
{
static struct address *last=NULL;
if(!last) last=in;
else last->next=in;
in->next=NULL;
last=in;
}
inputs()函數(shù)比較簡單,就不說明了。
dls_store()函數(shù)是將輸入的節(jié)點地址寫到上一個節(jié)點的next指針項。其中定義的結(jié)構(gòu)指針last是一個靜態(tài)變量,初始值為NULL,這意味著在編譯時將為該變量分配一個固定的存儲空間以存放其值。因初始值為NULL,這樣在第一次調(diào)用該函數(shù)時,由于它代表一個空指針,因而把由malloc()分配的第一個節(jié)點地址賦給它,使last指向該節(jié)點,第二次調(diào)用時,靜態(tài)變量last已指向第一個節(jié)點地址。如此反復(fù)調(diào)用,便建立起了n次調(diào)用產(chǎn)生的n個節(jié)點的鏈了(本題n=5)。
相關(guān)推薦:計算機等級考試二級C語言教程匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |