答案:
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、常德網(wǎng)絡(luò)推廣、小程序開發(fā)、常德網(wǎng)絡(luò)營銷、常德企業(yè)策劃、常德品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供常德建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
①p0
②p1
③NULL
解析:
p0指向要插入的結(jié)點,p1指向要和p0結(jié)點的info進(jìn)行比較的結(jié)點,如果找到應(yīng)該插入的位置,p0會被插入在p1之前,如果沒找到,會被插入在p1之后。
第一個if檢查鏈表是否為空,如果為空,直接將p0變?yōu)槭捉Y(jié)點就完成了插入。
while循環(huán)的作用是尋找插入位置,因為鏈表要求降序,所以用p1從首結(jié)點開始找,要找到第一個info小于等于p0結(jié)點的結(jié)點。每次循環(huán)結(jié)束后,p2將指向p1之前的結(jié)點,為后面的插入作準(zhǔn)備。
第二個if檢查之前的while循環(huán)是否找到這樣的結(jié)點。如果沒找到,說明前面從while循環(huán)出來時p1指向的是尾結(jié)點,這時要將p0插入到鏈表末尾,所以將p0插入到p1之后。p0的后面沒有結(jié)點,所以它的link指向NULL,所以第③問填NULL。如果找到了,那么進(jìn)入第三個if。
第三個if檢查p1是否剛好為首結(jié)點,如果為首結(jié)點,說明前的while循環(huán)根本沒進(jìn)去直接就出來了,這時p1之前沒有結(jié)點,p2還沒有指向任何結(jié)點,所以還不能使用p2。由于要將p0插入到p1之前,所以必須將p0變?yōu)槭捉Y(jié)點,所以第①問填p0。
如果p1不是首結(jié)點,進(jìn)行的就是常規(guī)的插入操作了,將p0插入到p1之前,p2之后,所以第②問填p1。注意這里不能填p2-link,因為這里不在第三個if的else里面,第三個if出來以后也要經(jīng)過這一步,而之前說了,如果進(jìn)入了第三個if,p2是不能使用的。
1、添加頭文件"stdio.h"
2、struct student * creat(void),但是你的main函數(shù)中返回接收卻是用的int*類型。
3、主函數(shù)main應(yīng)當(dāng)明確聲明為void main()
4、最為嚴(yán)重的是: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é)果
}
看我的回答怎么樣?
#includestdio.h#includewindows.h#include stdio.h#include malloc.h#include stdlib.h//定義數(shù)據(jù)類型名稱typedef int DataType;#define flag -1 //定義數(shù)據(jù)輸入結(jié)束的標(biāo)志數(shù)據(jù)//單鏈表結(jié)點存儲結(jié)構(gòu)定義typedef struct Node{ DataType data; struct Node *next;}LNode ,*LinkList;//建立單鏈表子函數(shù) LNode *Create_LinkList(){ LNode *s,*head,*L;int i=0,x; //定義指向當(dāng)前插入元素的指針 while(1) { scanf("%d",x); if(-1==x) { return head; break;} s= (LNode *)malloc(sizeof(LNode)); //為當(dāng)前插入元素的指針分配地址空間 s-data =x; s-next =NULL; i++; if(i==1) head=s; else L-next =s; L=s; }}//查找子函數(shù)(按序號查找)LNode *Get_LinkList(LinkList L,int i){ LNode *p; int j; //j是計數(shù)器,用來判斷當(dāng)前的結(jié)點是否是第i個結(jié)點 p=L; j=1; while(p!=NULLji) { p=p-next ; //當(dāng)前結(jié)點p不是第i個且p非空,則p移向下一個結(jié)點 j++; } return p;}//插入運算子函數(shù)void Insert_LinkList(LinkList L,int i,DataType x) //在單鏈表L中第i個位置插入值為x的新結(jié)點{ LNode *p,*s; p =Get_LinkList(L,i); //尋找鏈表的第i-1個位置結(jié)點 if(p==NULL) { printf("插入位置不合法!"); exit(-1); } else { s= (LinkList)malloc(sizeof(LNode)); //為當(dāng)前插入元素的指針分配地址空間 s-data =x; s-next =p-next ; p-next =s; }}//單鏈表的刪除運算子函數(shù)void Delete_LinkList(LinkList L,int i) //刪除單鏈表上的第i個結(jié)點{ LNode *p,*q; p=Get_LinkList(L,i-1); //尋找鏈表的第i-1個位置結(jié)點 if(p==NULL) { printf("刪除的位置不合法!"); //第i個結(jié)點的前驅(qū)結(jié)點不存在,不能執(zhí)行刪除操作 exit(-1); } else { if(p-next ==NULL) { printf("刪除的位置不合法!"); //第i個結(jié)點不存在,不能執(zhí)行刪除操作 exit(-1); } else { q=p-next ; p-next =p-next-next; free(q); } }}//求表長運算子函數(shù)int Length_LinkList(LinkList L){ int l; //l記錄L的表長 LNode *p; p=L; l=1; while(p-next) { p=p-next; l++; } return l;}int main (){ LNode *head,*p; head=(LinkList)malloc(sizeof(LNode)); int x,y; a: printf("*******menu*******\n"); printf("**創(chuàng)建**********1*\n"); printf("**插入**********2*\n"); printf("**刪除**********3*\n"); printf("**表長**********4*\n"); printf("**清屏**********5*\n"); printf("**打印**********6*\n"); printf("**退出******other*\n"); printf("******************\n"); int i=1; while(i) { printf("請輸入選項:"); scanf("%d",i); switch(i) { case 1:head=Create_LinkList(); getchar();break; case 2:printf("請輸入位置和數(shù)據(jù);"); scanf("%d%d",x,y); Insert_LinkList(head,x,y);break; case 3:printf("請輸入位置;"); scanf("%d",x); Delete_LinkList(head,x);break; case 4:printf("%d",Length_LinkList(head));break; case 5:system("cls");goto a; case 6:p=head; while(p!=NULL) {printf("%d\n",p-data); p=p-next;} break; default :i=0; } }}
我把創(chuàng)建給改了一下
printf("是否需要重新統(tǒng)計班級男女生比例:yes--1,no--0:");
scanf("%d\n",flag);//這里多個\n去掉,會影響你正常輸入
變成scanf("%d",flag);
//insert "OL" into Order_Linear_List @ "i"
Status ListInsert_OL(Order_Linear_List L , int i , Order_Linear_List OL){
cout"this function begain to run ...\n";
//check the "i" illegal or not
if(i1 || iL.length) return ERROR ;
//realloc the RAM when the previous storage space is full ...
if(L.length = L.listSize){
Order_Linear_List * newBaseAdd ;
newBaseAdd = (Order_Linear_List *)realloc(L.listBase,(L.listSize+LIST_INCREAMENT)*sizeof(Order_Linear_List));
if(!newBaseAdd)return(OVERFLOW);
L.listBase = newBaseAdd ;
L.listSize += LIST_INCREAMENT ;
}
//get the index of where to insert the element
Order_Linear_List *q ;
q = L.listBase[i-1];
//move the element behand of the insert-index
Order_Linear_List *p ;
for (p = L.listBase[L.length-1] ; p = q ; --p) *(p+1) = *p ;
*q = OL ;
L.length += 1;
return OK ;
}
鏈表分類型有:單鏈表、雙鏈表、單向環(huán)形鏈表、雙向環(huán)形鏈表。
單鏈表:只有一個頭節(jié)點為入口,并且每一個節(jié)點只有一個單向地址指向下一個節(jié)點,簡單的說在后一個節(jié)點無法返回上一個節(jié)點。
雙鏈表:有頭節(jié)點和尾節(jié)點作為入口,每一個節(jié)點有兩個地址,一個指向前一個節(jié)點,一個指向后一個節(jié)點。解決了單鏈表無法返回前一個節(jié)點的問題。
單向環(huán)形鏈表:這是一個特殊的單鏈表,這個鏈表是把它的最后一個節(jié)點地址指向首節(jié)點的入口處。如果它要查找前一個節(jié)點的時候需要,轉(zhuǎn)回首節(jié)點然后才能到達(dá)前一個節(jié)點。
雙向環(huán)形鏈表:顧名思義,構(gòu)成環(huán)形結(jié)構(gòu)的雙向鏈表。