哥們你這是數(shù)據(jù)結(jié)構(gòu)上的吧。。。。。。學(xué)數(shù)據(jù)結(jié)構(gòu)要靈活。。。。。
創(chuàng)新互聯(lián)IDC提供業(yè)務(wù):達州主機托管,成都服務(wù)器租用,達州主機托管,重慶服務(wù)器租用等四川省內(nèi)主機托管與主機租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機房,BGP機房,電信機房,移動機房,聯(lián)通機房。
這里給你一個建立鏈表的程序:(以SDUTOJ ? ? ? ?2116題為例題)
#include?iostream
using?namespace?std;
class?List
{
public:
int?data;//數(shù)據(jù)域,用來記錄數(shù)據(jù)
List?*next;//指著域,用來記錄它下一個節(jié)點的地址
//訪問這個變量能找到它的下一個節(jié)點
};
void?del(List?*p)//遞歸釋放內(nèi)存
{
if(p?==?NULL)//p為NULL說明p訪問到鏈表結(jié)尾了
return?;//訪問到結(jié)尾返回
del(p-next);//如果沒訪問到結(jié)尾,會在這里一直調(diào)用函數(shù)本身遞歸,直到遇見NULL
delete?p;//遇到NULL返回到head的時候,從后向前刪除節(jié)點,釋放內(nèi)存
//如果從前面刪除的話就會把本節(jié)點的next值也給刪除了,就沒辦法訪問到下一個節(jié)點了
//如果定義一個臨時變量先記錄下一個節(jié)點地址然后再刪除本節(jié)點也是可以解決這個問題的
}
//void?del(List?*head)
//{
//????List?*p?=?head,*q;
//????while(p)
//????{
//????????q?=?p;
//????????p?=?p-next;
//????????delete?q;
//????}
//}//這樣釋放內(nèi)存也是可以的
int?main()
{
List?*head?=?new?List;//new開辟內(nèi)存,地址賦給head,head代表這個
//鏈表的頭,訪問head能找到這個鏈表
head-next?=?NULL;//初始狀態(tài)下只有head鏈節(jié),他沒有后繼結(jié)點,所以他的next值為NULL(空)
List?*p,*q;//p是游動指針,建立鏈表的時候永遠指向最后一個鏈節(jié)
//q是開新內(nèi)存用的,也就是增加一個新的鏈節(jié)
int?n;//輸入數(shù)的個數(shù)
cinn;
p?=?head;//初始狀態(tài)下只有head一個鏈節(jié),那么最后一個鏈節(jié)也是head,讓p指向head
for(int?i?=?0;i??n;i++)
{
q?=?new?List;//增加新的鏈節(jié)q
cinq-data;//給新鏈節(jié)的data賦值
p-next?=?q;//把q掛在p(初始值是head)的后面
q-next?=?NULL;//新鏈節(jié)是鏈表的最后一個鏈節(jié),后面沒有后繼,那么,就把他的next值設(shè)為NULL(空)
p?=?q;//q成為p的后繼之后,q就是最后一個節(jié)點,我們規(guī)定p指向最后一個節(jié)點,這里就把q賦給p
}//循環(huán)完成后,鏈表就建立完了,head是他們的頭
p?=?head-next;//p在上面是指向最后一個元素,以便于增加新的鏈節(jié)后能很快的放在它的后面,達到添加鏈節(jié)的目的
//現(xiàn)在我們就發(fā)動他的游動特點,來訪問整個鏈表,從上面看來,我們輸入的第一個整數(shù)放在q-data
//里面了,并沒有放在head里面,那么,我們訪問的話,head的下一個節(jié)點才是第一個存儲節(jié)點,用p
//訪問head的next,判就指向了鏈表中的第一個存儲輸入數(shù)的節(jié)點(真正第一個節(jié)點是head,因為head
//因為head的data沒有值,所以,我們說head的后面第一個節(jié)點為有效節(jié)點)
while(p?!=?NULL)//當(dāng)p訪問不到NULL的時候,就會一直循環(huán),NULL是鏈表結(jié)束的標(biāo)志
{
coutp-data;//輸出p訪問到的每個節(jié)點的data值
if(p-next?!=?NULL)
cout"?";//這兩行是調(diào)格式的,為了能在最后不多輸出空格,其實只是為了在OJ上AC
p?=?p-next;//p訪問把本節(jié)點的next值,p就指向下一個節(jié)點,相當(dāng)于向后移動一個節(jié)點
}
coutendl;
del(head);//釋放內(nèi)存
return?0;
}
根據(jù)我對你的 C 語言源代碼的分析,你的源程序中只提供了如下子函數(shù):(1)、計算鏈表長度:getlen( );(2)、刪除鏈表指定元素:delete( );(3)、在鏈表中插入一個指定元素:insert( ) ;(4)、遍歷整個鏈表:list( )。
而關(guān)于到底如何創(chuàng)建一個新鏈表,你的這個 C 語言源程序代碼中并沒有寫出來。而 C 語言中功能最最強大的、同時并且最最難于調(diào)試的代碼就是:指針!!而一旦指針再用于對鏈表的各種操作中(創(chuàng)建、插入、刪除、遍歷等),如果沒有豐富的 C 語言編程經(jīng)驗的話,那要想調(diào)試通過一個對鏈表的各種操作,就更是:難上加難。
所以我個人的建議還是:你必須要親自仔細閱讀《數(shù)據(jù)結(jié)構(gòu)》C語言版的教材,而且最最重要的就是:一定要親自上機編寫、并調(diào)試鏈表程序源代碼才行!別人很難于給你馬上就寫出來一個正確的、可以執(zhí)行的鏈表源代碼。這就是我當(dāng)時學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)、以及 C 語言指針的親身體會。
main可以建立兩個多項式,相加后得到另一個多項式。并輸出這三個多項式。然后釋放鏈表空間。結(jié)束程序。
1、添加頭文件"stdio.h"
2、struct student * creat(void),但是你的main函數(shù)中返回接收卻是用的int*類型。
3、主函數(shù)main應(yīng)當(dāng)明確聲明為void main()
4、最為嚴重的是:struct student * creat(void) 函數(shù)體中使用了局部變量struct student *head; struct student *p1,*p2; 但是函數(shù)結(jié)束的地方卻要返回這些指針,因此返回的值是無效數(shù)據(jù)。返回時,已經(jīng)不再作用域了,是無效的空間。建議把這些數(shù)據(jù)當(dāng)作輸入?yún)?shù),指針類型的。就可以正確的接收分配的struct student空間以及指針了。
5、struct student * creat(void) 函數(shù)體中,臨時指針*p1、*p2再函數(shù)返回之前應(yīng)當(dāng)設(shè)置為NULL,避免因為局部變量的作用域結(jié)束導(dǎo)致相關(guān)的空間被清除。
總之,我建議把struct student * creat(void)定義修改為:
void creat(struct student **head).
以上內(nèi)容經(jīng)過調(diào)試,可以使用。
==================我的程序,經(jīng)過完整的調(diào)試
#include "stdafx.h"
#include "malloc.h"
#include "stdio.h"
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student *next;
};
int n;
void creat(struct student **head) /*定義函數(shù),此函數(shù)帶回一個指向鏈表頭的指針*/
{
struct student *p1,*p2;
n=0;
do
{
p1=(struct student *)malloc(LEN); /*開辟一個新單元*/
p1-next=NULL;
scanf("%ld,%f",p1-num,p1-score);
if(p1-num==0)
break;
n++;
if(n==1)
*head=p1;
else
p2-next=p1;
p2=p1;
} while(p1-num!=0) ;
p1=NULL;
p2=NULL;
}
void main()
{
struct student *p;
creat(p);
if(p!=NULL)
do
{
printf("%ld %5.1f\n",p-num,p-score);
p=p-next;
}while(p!=NULL);
flushall(); //清除鍵盤緩沖區(qū),避免輸入混淆
getchar(); //等待鍵盤任意輸入,以便觀察運算結(jié)果
}
看我的回答怎么樣?
文章名稱:數(shù)據(jù)結(jié)構(gòu)鏈表c語言主函數(shù) 數(shù)據(jù)結(jié)構(gòu)鏈表c語言實現(xiàn)
文章分享:http://chinadenli.net/article42/dogcoec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、做網(wǎng)站、網(wǎng)站設(shè)計、網(wǎng)站導(dǎo)航、營銷型網(wǎng)站建設(shè)、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)