原鏈表1 2 3。第一段函數運行正確,插入后為1 2 4 3;改為第二段代碼運行,結果為2 3 4。問題來了,注意我標出的地方p=(*L);第一段函數我用p做鏈表元素操作,第二段全替換為(*L)鏈表元素操作。為什么結果卻不同了,如果p是(*L)的指針,結果應該相同;如果(*L)只是給p賦值的話,那么showlist()函數應該顯示(*L)原鏈表而不是修改過的p鏈表?我想問題主要是我對p=(*L);的理解不夠吧
status Listinsert(Linklist *L,int j,Elemtype e)
{
Linklist p,r;
p=(*L); //
int i=2;
r=(Linklist)malloc(sizeof(Node));
r->data=e;
r->next=NULL;
while(i<j)
{
i++;
p=p->next;
}
r->next=p->next;
p->next=r;
return OK;
}
和
status Listinsert(Linklist *L,int j,Elemtype e)
{
Linklist p,r;
//p=(*L); //下面用(*L)替換p,運行后有問題
int i=2;
r=(Linklist)malloc(sizeof(Node));
r->data=e;
r->next=NULL;
while(i<j)
{
i++;
(*L)=(*L)->next; //替換
}
r->next=(*L)->next; //替換
(*L)->next=r;
return OK;
}
////////////////////////////////////////
完整代碼
#include <stdio.h>
#include <stdlib.h>
typedef int status,Elemtype;
#define OK 1
#define NO 0
typedef struct Node
{
status data;
struct Node *next;
} Node;
typedef struct Node* Linklist;
void Initlist(Linklist *L)
{
(*L)=(Linklist)malloc(sizeof(struct Node));
(*L)->data=0;
(*L)->next=NULL;
}
status Listinsert(Linklist *L,int j,Elemtype e) ////正確
{
Linklist p,r;
p=*L;
int i=2;
r=(Linklist)malloc(sizeof(Node));
r->data=e;
r->next=NULL;
while((*L)&&i<j)
{
i++;
p=p->next;
}
r->next=p->next;
p->next=r;
return OK;
}
status Getelem(Linklist L,int j,Elemtype *e)
{
Linklist p;
int i;//
for(i=0; i<j-1; i++)
{
p=L->next;
L=p;
}
L->next=NULL;
(*e)=L->data;
return OK;
}
void showlist(Linklist L)
{
Linklist p;
while(L)
{
printf("%d\n",L->data);
p=L->next;
L=p;
}
}
int main()
{
int x=1;
int *e=&x;
Node *root,first,second,third;
first.data=1;
first.next=&second;
second.data=2;
second.next=&third;
third.data=3;
third.next=NULL;
root=&first;
//showlist(root);
// if(Getelem(root,3,e))
// printf("%d",*e);
if(Listinsert(&root,3,4)==1)
showlist(root);
return 0;
}
添加回答
舉報
0/150
提交
取消