下面這是出錯的程式:
void selectnum(stu *head)
{ int num,j;
stu *p=head;
printf("輸入要查詢的學號\n");
scanf("%d",&num);
while(p->num!=num)
{p=p->next;
if (p=NULL) {printf("未查詢到該學生\n");return;}
}
printf("資訊如下:\n");
printf("學號\t 姓名\t電話\t\t郵箱\t 地址\t生日(年 月 日) \n");
printf("%d %s %s %s %s %d %d %d\n",p->num,p->name,p->call,p->email,p->address,p->b.year,p->b.month,p->b.day);
printf("輸入:1繼續.\n2結束.\n");
scanf("%d",&j);
if(j==1)
return;
else
baymanu();
}
輸入學生資訊創建鏈表后,查詢第一個學生是沒問題的,但是如果查詢后面的學生就會報錯,提示記憶體為不可讀,新手不才,一直找不到錯誤所在,望各路大神賜教
uj5u.com熱心網友回復:
僅供參考://不帶表頭結點的單向鏈表
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <locale.h>
struct NODE {
int data;
struct NODE *next;
} *head,*p,*q,*s,*p1,*p2,*q1,**ta;
int i,k,n,t,m,v,N=10;
int main() {
setlocale(LC_ALL,"chs");
srand(time(NULL));
head=NULL;
printf("創建%d個節點的單鏈表:",N);//創建N個節點的單鏈表
p=head;
for (i=0;i<N;i++) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) exit(1);
q->data=https://bbs.csdn.net/topics/rand()%100;//填寫0..99的隨機值
q->next=NULL;
if (NULL==p) {
head=q;
p=head;
} else {
p->next=q;
p=q;
}
}
//輸出整個單鏈表
s=head;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
k=3;
v=5;
printf("將值為%d的結點插入到單鏈表的第%d個結點前:",v,k);//將值為v的結點插入到單鏈表的第k個結點前
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==1) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) exit(1);
q->data=https://bbs.csdn.net/topics/v;
q->next=head;
head=q;
break;
} else {
if (k-1==n) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) exit(1);
q->data=https://bbs.csdn.net/topics/v;
q->next=p->next;
p->next=q;
break;
}
}
p=p->next;
}
//輸出整個單鏈表
s=head;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
k=5;
printf("洗掉第%d個節點:",k);//洗掉第k個節點
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==1) {
q=head;
head=head->next;
free(q);
break;
} else {
if (k-1==n) {
q=p->next;
if (q) {
p->next=q->next;
free(q);
}
break;
}
}
p=p->next;
}
//輸出整個單鏈表
s=head;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
printf("從小到大排序:");//從小到大排序
for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {
for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {
if (p->data > q->data) {
//交換data
// printf("swap %02d %02d\n",p->data,q->data);
// t=p->data;p->data=https://bbs.csdn.net/topics/q->data;q->data=t;
//或者
//交換next
// printf("swap %02d %02d\n",p->data,q->data);
if (p==head) {//p是頭
if (p->next==q) {//pq挨著
head=q;
p->next=q->next;
q->next=p;
q=p;
p=head;
} else {//pq不挨著
head=q;
p2=p->next;
p->next=q->next;
q->next=p2;
q1->next=p;
q=p;
p=head;
}
} else {//p不是頭
if (p->next==q) {//pq挨著
p1->next=q;
p->next=q->next;
q->next=p;
q=p;
p=p1->next;
} else {//pq不挨著
p1->next=q;
p2=p->next;
p->next=q->next;
q->next=p2;
q1->next=p;
q=p;
p=p1->next;
}
}
//輸出整個單鏈表
// s=head;
// while (1) {
// if (NULL==s) {
// printf("\n");
// break;
// }
// printf("%02d->",s->data);
// s=s->next;
// }
// getchar();
}
}
}
//輸出整個單鏈表并計算鏈表長度n
n=0;
s=head;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
n++;
s=s->next;
}
printf("將整個鏈表逆序:");//將整個鏈表逆序
if (n>=2) {
p=head;
q=p->next;
p->next=NULL;
while (1) {
q1=q->next;
q->next=p;
p=q;
q=q1;
if (NULL==q) break;
}
head=p;
}
//輸出整個單鏈表
s=head;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
m=4;
n=6;
printf("將單鏈表中前%d個結點和后%d個結點進行互換:",m,n);//將單鏈表中前m個結點和后n個結點進行互換,m+n為鏈表總長
k=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
k++;
if (m==k) {
q=p;
}
s=p;
p=p->next;
}
q1=head;
head=q->next;
s->next=q1;
q->next=NULL;
//輸出整個單鏈表
s=head;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//釋放所有節點
p=head;
while (1) {
if (NULL==p) {
break;
}
q=p->next;
free(p);
p=q;
}
return 0;
}
//創建10個節點的單鏈表:08->74->07->23->03->99->31->56->88->16->
//將值為5的結點插入到單鏈表的第3個結點前:08->74->05->07->23->03->99->31->56->88->16->
//洗掉第5個節點:08->74->05->07->03->99->31->56->88->16->
//從小到大排序:03->05->07->08->16->31->56->74->88->99->
//將整個鏈表逆序:99->88->74->56->31->16->08->07->05->03->
//將單鏈表中前4個結點和后6個結點進行互換:31->16->08->07->05->03->99->88->74->56->
//
uj5u.com熱心網友回復:
老師我確定我創建的鏈表沒問題,問題出在查詢功能的代碼上,能否幫我看一下這段代碼有什么錯誤么?為什么會導致報錯啊uj5u.com熱心網友回復:
不要依賴除錯器輸出復雜資料結構!而要將復雜資料結構的整個內容在處理它的每一步使用一小段代碼按自己很容易理解的格式輸出,非常有助于除錯!或者可以說是“基礎設施”uj5u.com熱心網友回復:
記憶體為不可讀看到這樣的錯誤, 那么就可以肯定是指標有問題, 要么空指標, 要么野指標.
void selectnum(stu *head)
{
int num,j;
stu *p=head;
printf("輸入要查詢的學號\n");
scanf("%d",&num);
while(p->num!=num)
{
p=p->next;
if (p=NULL)
{
printf("未查詢到該學生\n");
return;
}
}
看你的代碼, 如果head為null 或者野指標, 那么肯定會報 記憶體不能為讀
如果某一個p->next為野指標, 那么肯定也會報 記憶體不能為讀 ------ 如果這種情況, 那么你的鏈表操作(添加,洗掉,修改)肯定有問題.
p->num,p->name,p->call,p->email,p->address,p->b.year,p->b.month,p->b.day
還有這一堆資料.
如果其中的一個成員變數是指標, 并且為慷訓者野指標, 那么也肯定是會報 記憶體不能為讀
這種情況的話, 就是記憶體分配管理有問題
趙老師說得對, 除錯是發現問題的最快的方式.
按 F5鍵 除錯運行, 當出現記憶體錯誤彈框的時候, 點擊中斷即可停止在錯誤的地方, 看代碼執行到哪行
uj5u.com熱心網友回復:
void selectnum(stu *head){
if(head==NULL) return;
int num,j;
stu *p=head;
printf("輸入要查詢的學號\n");
scanf("%d",&num);
while(p&&p->num!=num)
{
p=p->next;
if (p==NULL)
{
printf("未查詢到該學生\n");
return;
}
}
uj5u.com熱心網友回復:
關于自己是否適合編程的很簡單的測驗:在報紙或雜志上隨便找一段約1000字的文章,在Word中輸入一遍。輸完后再參考下面答案:
A里面有10處以上文字或標點錯誤
B里面沒有文字或標點錯誤并敢為此跟人打賭
C里面沒有文字或標點錯誤并且字體和排版完全與原稿一致
D列印在半透明的紙上和原稿重疊在一起檢查一模一樣,且自我感覺很有成就感
A不適合編程(理由:打字準確度偏低、粗心大意)
B初級程式員(理由:打字準確度很高、認真細致、自信、理解全角半角概念)
C高級程式員(理由:在B的基礎上理解字體和排版也是電腦列印的重要因素、但相比D還不夠偏執、精益求精、結果可驗證)
D軟體專案經理(理由:能針對專案給出令人信服的細致到極點的需求說明和典型測驗用例。用戶幾乎挑不出毛病。專業!)
如果想從A變成B的話,到我的資源http://download.csdn.net/detail/zhao4zhong1/4084259里面下載“適合程式員的鍵盤練習”
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/118204.html
標籤:基礎類
上一篇:關于VS2015工程生成問題
