這個(gè)程序有兩個(gè)主要問題
發(fā)展壯大離不開廣大客戶長(zhǎng)期以來的信賴與支持,我們將始終秉承“誠信為本、服務(wù)至上”的服務(wù)理念,堅(jiān)持“二合一”的優(yōu)良服務(wù)模式,真誠服務(wù)每家企業(yè),認(rèn)真做好每個(gè)細(xì)節(jié),不斷完善自我,成就企業(yè),實(shí)現(xiàn)共贏。行業(yè)涉及展覽展示等,在成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站、WAP手機(jī)網(wǎng)站、VI設(shè)計(jì)、軟件開發(fā)等項(xiàng)目上具有豐富的設(shè)計(jì)經(jīng)驗(yàn)。
1. void insert(list*pHead,list*pNode)因?yàn)槭前粗祩鬟f的 pHead值,所以不能改變pHead的值,改為按地址傳遞,list** pHead
2. insert()中,第一,二種情況時(shí),沒有組成循環(huán)鏈表的閉環(huán)(沒有更新尾節(jié)點(diǎn)的next為新的head)。修改后的程序如下:
#includestdio.h //預(yù)編譯命令
struct list//定義結(jié)構(gòu)體
{
int num;
list* next;
};
list *head,*end; //定義全局變量
list* creat()//創(chuàng)建鏈表的函數(shù)
{
list* p=NULL;
list* q=NULL;
head=NULL;
int num;
scanf("%d",num);
while(num!=0)
{
p=new list; //開辟空間
p-num=num;
if(head==NULL)
head=p;
else
q-next=p;
q=p;
scanf("%d",num);
}
end=q; //將鏈表的結(jié)尾最后一個(gè)結(jié)點(diǎn)賦給end
end-next=head; //讓最后一個(gè)結(jié)點(diǎn)的的下個(gè)結(jié)點(diǎn)的地址不為空而指向頭指針
return(head);
}
void insert( list** pHead,list* pNode) //插入接點(diǎn)的函數(shù),
{
list *q,*r;
//第一種情況,鏈表為空
if(*pHead==NULL)
{
*pHead=pNode; //鏈表頭指向pNode
(*pHead)-next = *pHead;//為了循環(huán)用
return; //完成插入操作,返回
}
//第二種情況,pNode結(jié)點(diǎn)num的值小于dengyu鏈表頭結(jié)點(diǎn)num的值
//則將pNode的值插到鏈表頭部
if(pNode-num=(*pHead)-num)
{
//這是為了更新最后一個(gè)端點(diǎn)與頭節(jié)點(diǎn)的連接
list* pos = *pHead;
while (pos-next != *pHead)
{
pos = pos-next;
}
pos-next = pNode;
pNode-next= (*pHead);
*pHead=pNode;
return;
}
//第三種情況,循環(huán)查找正確位置
r=*pHead;
q=(*pHead)-next;
while(q!=*pHead)
{
if(pNode-numq-num)
{
r=q;
q=q-next;
}
else
break;
}
//如果插入到最后的位置,則更新pEnd的值
r-next=pNode;
pNode-next=q;
}
list* together(list* p1,list* p2) //定義兩個(gè)鏈表合并的函數(shù)
{
list *q,*r;
q=p2;
do
{
r=new list; //開辟空間
r-num=q-num; //將q的值賦給r
insert(p1,r); //調(diào)用插入結(jié)點(diǎn)的函數(shù)
q=q-next; //指針向后撥一個(gè)接點(diǎn)
}while(q!=p2); //當(dāng)在最后一個(gè)結(jié)點(diǎn)時(shí)停止循環(huán)
return(p1); //返回頭指針
}
void main() //主函數(shù)
{
list *list1,*list2,*r,*q;
list1=creat(); //調(diào)用創(chuàng)建鏈表的函數(shù)
list2=creat(); //調(diào)用創(chuàng)建鏈表的函數(shù)
r=together(list1,list2); //調(diào)用合并兩個(gè)鏈表的函數(shù)
q=r-next;
for(;q!=r;q=q-next)
printf("%d ",q-num);
}
在這個(gè)程序的基礎(chǔ)上改下,剛好無聊寫了下。關(guān)鍵還是自己去想。#includestdio.h
#includestdlib.h
#includestring.h
#define MAX 50
struct person
{
char name[MAX];
int number;
struct person *next;
};struct person * input()
{
struct person *p,*q,*head;
head = NULL;
char temp[MAX];
puts("In put name:");
while(gets(temp)!=NULL temp[0] != '\0')
{
p = (struct person*)malloc(sizeof(struct person));
if(head == NULL)
head = p;
else
q-next = p;
p-next = NULL;
strcpy(p-name,temp);
puts("number:");
scanf("%d",p-number);
while(getchar()!='\n')
continue;
puts("The next name:");
q = p; }
return head;
}
void out(struct person *head)
{
struct person *p;
if(head == NULL)
puts("Not name in line");
else
{
p = head;
puts("---------------------");
puts("the person with number:");
while(p)
{
{
printf("name is %s the number is %d\n",p-name,p-number);
p=p-next;
}
}
puts("out end");
}
}
void cleanup(struct person *head)
{
struct person *p;
p=head;
while(p!=NULL)
{
free(p);
p=p-next;
}
}
main()
{
struct person *head;
head = input();
out(head);
cleanup(head);
return 0;
}
首先,主函數(shù)中,“請(qǐng)輸入插入的數(shù)據(jù)”那里scanf應(yīng)該是b,這是引發(fā)崩潰的原因。
其次,insert函數(shù)的目的應(yīng)該是想插入數(shù)據(jù)后仍是有序鏈表。但你的insert函數(shù)邏輯太亂,有些不必要的判斷,我修正了你的代碼,貼給你看看。(雖然你insert是想保證有序,但你在創(chuàng)建的時(shí)候沒有保證有序,所以最終結(jié)果不一定是有序。例如,創(chuàng)建 1,5,2,插入3,最后輸出的是 1,3,5,2)
代碼修改:
scanf("%d", b);
重寫了insert函數(shù),簡(jiǎn)化邏輯;
動(dòng)態(tài)分配的內(nèi)存記得釋放,增加freeNode釋放空間
#include?stdio.h
#include?stdlib.h
struct?link
{
int?data;
struct?link?*next;
};
struct?link?*add(struct?link?*head);//創(chuàng)建鏈表?
void?display(struct?link?*head);//輸出數(shù)據(jù)?
struct?link?*insert(struct?link?*head,?int?b);?//插入新節(jié)點(diǎn)?
void?freeNode(struct?link?*); //釋放空間
int?main()
{
char?c;
struct?link?*head?=?NULL;
printf("要?jiǎng)?chuàng)建一個(gè)鏈表嗎?");
scanf("?%c",?c);
while?(c?==?'y'?||?c?==?'Y')
{
head?=?add(head);
printf("要繼續(xù)創(chuàng)建節(jié)點(diǎn)嗎?");
scanf("?%c",?c);
}
display(head);
int?b;
printf("輸入插入的數(shù)據(jù)");
scanf("%d",?b);
head?=?insert(head,?b);
display(head);
freeNode(head);
}
struct?link?*add(struct?link?*head)
{
int?data;
struct?link?*p?=?(struct?link*)malloc(sizeof(struct?link));
if?(head?==?NULL)
{
head?=?p;
}
else
{
struct?link?*pr?=?head;//一個(gè)臨時(shí)指針pr先保存下head的地址?
while?(pr-next?!=?NULL)
{
pr?=?pr-next;
}
pr-next?=?p;
}
printf("輸入數(shù)據(jù)");
scanf("%d",?p-data);
p-next?=?NULL;
return?head;
}
void?display(struct?link?*head)
{
struct?link?*pr?=?head;
while?(pr?!=?NULL)
{
printf("%d\n",?pr-data);
pr?=?pr-next;
}
}
struct?link?*insert(struct?link?*head,?int?b)
{
struct?link?*ptr?=?head,?*prev?=?head;
struct?link?*newNode?=?(struct?link?*)malloc(sizeof(struct?link));
newNode-data?=?b;
while?(ptr??b??ptr-data)?{
prev?=?ptr;
ptr?=?ptr-next;
}
newNode-next?=?ptr;
if?(ptr?==?head) head?=?newNode;
else prev-next?=?newNode;
return?head;
}
void?freeNode(struct?link?*node)?{
if?(!node) return;
freeNode(node-next);
free(node);
}
本文名稱:c語言創(chuàng)建節(jié)點(diǎn)函數(shù) c語言創(chuàng)建新節(jié)點(diǎn)
網(wǎng)頁網(wǎng)址:http://jinyejixie.com/article38/ddcoipp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、品牌網(wǎng)站制作、營(yíng)銷型網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站營(yíng)銷、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)