#資料結構#
求助:
這個函式寫的有什么問題嗎?
while回圈好像進不去。
L里已經有兩個結點了,呼叫這個后插法的函式,插入的結點會把原來的結點替換掉。
uj5u.com熱心網友回復:
建議直接貼代碼,然后提供更多的代碼,包括呼叫的。看函式開頭,給r申請空間,然后馬上r = L;這樣會導致記憶體泄露,因為r剛才申請的空間沒辦法釋放了,找不到地址了。
uj5u.com熱心網友回復:
函式怎么呼叫的?L在哪賦值?IniLinkList(L)的代碼沒問題嗎?另外提一下,如果想讓r=L; 那么這句代碼的前一條代碼 r=(DogNode*)malloc(sizeof(DogNode))就是多余,還造成記憶體泄漏
uj5u.com熱心網友回復:
IniLinkList(L)初步判斷這個函式是初始化L,里面應該會有malloc陳述句,那么r=(DogNode*)malloc(sizeof(DogNode))這一句的確多余。uj5u.com熱心網友回復:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Dog
{
char name[10];
int id;
}Dog;
typedef struct DogNode
{
Dog dog;
struct DogNode *next;
}DogNode,*DogLinkList;
/*
注意:
1.結點指標和結點兩個不同的概念
2.DogLinkList是結構體指標 DogLinkList p<=> DogNode *p;
*/
void IniLinkList(DogLinkList &L)
/*
生成一個頭結點
*/
{
L=(DogLinkList)malloc(sizeof(DogNode));
strcpy(L->dog.name,"這是頭結點");
L->next=NULL;
}
void CreateList_H(DogLinkList &L,int n)
//從前面插入結點 n個元素的值
{
IniLinkList(L);
DogNode *p;
for(int i=0;i<n;i++)
{
p=(DogNode*)malloc(sizeof(DogNode));
printf("輸入狗的資訊:");
scanf("%s %d",p->dog.name,&(p->dog.id));
//頭插入:讓 p指向第一個結點后再讓頭結點指向 p
//p變為第一個結點,原第一個結點變為第二個結點
p->next=L->next;
L->next=p;
}
}
void CreateList_R(DogLinkList &L,int n)
//后插法
//從后面插入n個結點
{
DogNode *r;
r=L;
while(r->next!=NULL)
{
r=r->next;
}
DogNode *p;
for(int i=0;i<n;i++)
{
p=(DogNode*)malloc(sizeof(DogNode));
printf("輸入狗的資訊:");
scanf("%s %d",p->dog.name,&(p->dog.id));
p->next=NULL;
r->next=p;
r=p;
}
}
void GetElem(DogLinkList L,int i,Dog &dog)
{
//獲取第i個結點的值放在dog里
DogNode *p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
printf("error");
else
{
dog.id=p->dog.id;
strcpy(dog.name,p->dog.name);
}
}
DogNode *LocateElem(DogLinkList &L,Dog dog)
{
//定位dog
DogNode *p;
p=L->next;
while(p&&(p->dog.id!=dog.id)&&(!strcmp(p->dog.name,dog.name)))
p=p->next;
return p;
}
void ListInsert(DogLinkList &L,int i,Dog &dog)
{
//在第i個位置插入dog
DogNode *p,*s;
s=(DogNode*)malloc(sizeof(DogNode));
p=L;
int j=0;
while(p&&(j<i))
{
p=p->next;
j++;
}
if(p!=NULL)
{
s->dog.id=dog.id;
strcpy(s->dog.name,dog.name);
s->next=p->next;
p->next=s;
}
}
//洗掉的結點要free()
void DelElem(DogLinkList &L,int i)
{
DogNode *p,*q;
p=L;int j=0;
while((p->next)&&(j<i-1))
{
p=p->next;j++;
}
if(p->next!=NULL&&(j==i-1))
{
q=p->next;p->next=q->next;
free(q);
}
}
void PrintList(DogLinkList &L)
{
DogNode *p;//p臨時變數名,不用再 malloc
p=L->next;
while(p!=NULL)
{
printf("%s %
uj5u.com熱心網友回復:
其他都沒題應該,我都測驗過,我把代碼放評論區了
uj5u.com熱心網友回復:
哦哦,我知道問題了,應該吧這個初始化刪掉,因為前面初始化過了,謝謝哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/72856.html
標籤:C語言
