1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct LNode{ 4 int data; 5 struct LNode *next; 6 7 }LNode,*Linklist; 8 //尾插法创建单链表 9 Linklist CreatList(Linklist &L){ 10 LNode *s,*r=L;//r为指向表尾的指针 11 int x; 12 //L=(Linklist)malloc(sizeof(LNode));(此句王道书籍上代码位置有错,屏蔽) 13 scanf("%d",&x); 14 while(x!=9999){//输入9999退出 15 s=(LNode *)malloc(sizeof(LNode)); 16 s->data=x;//创建的新的结点s的data赋x值 17 r->next=s;//r作为指针它的下个结点指向了新创建的结点s 18 r=s; //可以理解成将r继续作为尾指针(假装代替了上一个s)继续指向新的表尾结点 19 scanf("%d",&x); 20 } 21 r->next=NULL;//尾结点指针置空 22 return L; 23 } 24 //遍历输出链表中的值 25 void Travel(Linklist &L){ 26 struct LNode *p=L->next; 27 if(p==NULL){ 28 printf("链表为空"); 29 }else{ 30 while(p!=NULL){ 31 printf(" p->data %d",p->data); 32 /*输出删除的结点的值, 33 由于下面调用了delete的固定值为5 34 (主函数里调用Delete_one(L,5);) 35 所以运行结果是删除所有结点值为5的结点 36 */ 37 p=p->next; 38 } 39 } 40 41 } 42 void Delete_one(Linklist &L,int x){ 43 LNode *p; //定义一个p结点指向删除结点 44 if(L==NULL)//递归出口 45 return; 46 if(L->data==x){//如果L所指结点的值为x 47 p=L; //删除*L结点,并让L指向下一结点 48 L=L->next; 49 free(p); 50 Delete_one(L,x);//递归调用 51 printf(" 被删除的结点是:%d",x); 52 return; 53 }else{ //如果L所指结点的值不是x 54 Delete_one(L->next,x);//进行下个结点的判断 55 } 56 } 57 int main(){ 58 Linklist L; 59 L=(Linklist)malloc(sizeof(LNode)); 60 CreatList(L); 61 Delete_one(L,5);//删除值为5的结点 62 Travel(L); 63 }
总结:对于王道数据结构2019版本中的一串代码运行后,发现错误但是并不清楚错在哪,后来争论后知道原因在于重新申请的L内存空间而没有对其进行操作的代码,后面return的必然是个空,因此在主函数中增加L=(LinkList)malloc(sizeof(LNode)); 也可以在Create函数开始的地方添加,在对其进行操作。总结自身,过于依赖书上的代码没有自身理解后运行,这一点还是得感谢阿浩同学。
代码注释过多是为了便于后期复习,不要在意‘细节’。
so测试数据如下: