|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
keilC 中建立單鏈表程序,大俠們看看是哪的毛病 |
| 作者:chariar 欄目:單片機(jī) |
struct det{ uCHAR hole; uint sn; //序列號 uCHAR stat; //狀態(tài) struct det *next; //下一個地址 }; typedef struct det list; /*---------------------建立單鏈表------------------------------------*/ list * creat(void) /*建立單鏈表的函數(shù)*/ {list *p,*h,*s; /* *h保存表頭結(jié)點(diǎn)的指針,*p指向當(dāng)前結(jié)點(diǎn)的前一個結(jié)點(diǎn),*s指向當(dāng)前結(jié)點(diǎn)*/ h=(list *)malloc(sizeof(list)); /*分配空間并檢測*/ h->hole='\0'; h->sn='\0'; /*把表頭結(jié)點(diǎn)的數(shù)據(jù)域置空*/ h->stat='\0'; h->next=NULL; /*把表頭結(jié)點(diǎn)的鏈域置空*/ p=h; /*p指向表頭*/ s= (list *) malloc(sizeof(list)); /*分配新存儲空間并檢測*/ p->next=s; /*把s的地址賦給p所指向的結(jié)點(diǎn)的鏈域,這樣就把p和s所指向的結(jié)點(diǎn)連接起來了*/ s->hole=0; s->sn=0; s->stat=0; s->next=NULL; return h; } list * search(CHAR n) /*查找鏈表的函數(shù),n要查找的坑號,當(dāng)前結(jié)點(diǎn)的坑號小于n,后結(jié)點(diǎn)的坑號小于n,用于執(zhí)行插入前確定位置,返回<n的結(jié)點(diǎn)指針*/ { list *p,*p1; /*p當(dāng)前指針,指向要與所查找的坑號比較的結(jié)點(diǎn),,p1后一結(jié)點(diǎn)的指針*/ CHAR y; /*保存結(jié)點(diǎn)數(shù)據(jù)域內(nèi)坑號的變量*/ p=HEAD->next; while(p!=NULL) { y=p->hole; p1=p->next; if((p->next)!=NULL&&y<n&&n<(p1->hole)) /*把數(shù)據(jù)域里的坑號與所要查找的坑號比較,若相同則返回0,即條件成立*/ return p; /*返回與所要查找結(jié)點(diǎn)的地址*/ else p=p->next; } if(p==NULL&&(p->hole)<n) return p; } void insert(n,pin1,st1) /*插入坑號為n,序列碼為pin1,狀態(tài)字為st1的結(jié)點(diǎn)*/ { list *s; /*指針s是保存新結(jié)點(diǎn)地址的*/ list *p; if(n!=1) { p=search(n); s= (list *)malloc(sizeof(list)); s->hole=n; s->sn=pin1; s->stat=st1; s->next=p->next; /*把新結(jié)點(diǎn)的鏈域指向原來p結(jié)點(diǎn)的后繼結(jié)點(diǎn)*/ p->next=s; /*p結(jié)點(diǎn)的鏈域指向新結(jié)點(diǎn)*/ } else{ s= (LINK) malloc(sizeof(list)); s->hole=n; s->sn=pin1; s->stat=st1; s->next=HEAD->next; /*把新結(jié)點(diǎn)的鏈域指向原來p結(jié)點(diǎn)的后繼結(jié)點(diǎn)*/ HEAD->next=s; /*p結(jié)點(diǎn)的鏈域指向新結(jié)點(diǎn)*/ } } void main(void) { list *HEAD; int y; y=init_mempool(0x1000,sizeof(list)*200); HEAD=creat(); insert(1,12345,0x81); insert(2,23540,0x85); } 各位GGJJ幫忙看看,這程序有什么毛病,我的本意是想建立的一個單鏈表,只有個頭結(jié)點(diǎn)和尾,然后在插入兩個結(jié)點(diǎn),結(jié)果在執(zhí)行插入操作時,這兩個結(jié)點(diǎn)分配的空間地址s都為0x0000,所以導(dǎo)致每插入一個就將之前插入的那個結(jié)點(diǎn)給覆蓋掉了,但是在創(chuàng)建鏈表程序中melloc函數(shù)返回的值卻是正確的,郁悶 * - 本貼最后修改時間:2005-1-14 14:28:41 修改者:CHARiar |
| 2樓: | >>參與討論 |
| 作者: 不務(wù)正業(yè) 于 2005/1/15 0:07:00 發(fā)布:
malloc 返回分配的地址空間,如果失敗應(yīng)該返回0 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |