我录的歌 http://1680279./ 我现在打不开了????
#include <stdio.h> #define len sizeof(struct a) #include <malloc.h>
struct a { char lk; struct a *next ; };
main() { struct a *head,*p,*q,*s; int i; char ch; head=p=(struct a *) malloc(len); for(i=1;i<=26;i++) { (p->lk)=('a'+i-1); ///**000**change start //为什么这么改实际上第26个的next应该不存在了几应该为NULL if ( i != 26 ) { p->next=(struct a *)malloc(len); p=p->next; } else { p->next = NULL; } /////**000**change end } //p->next=NULL; 00000 delete *********** p=head; while ( p != NULL ) //**111*** changed while (p->next != NULL) { printf("%c ",p->lk); p=p->next; } printf("\n"); q=p=head; printf("\ninput deleted letter:"); scanf("%c",&ch); fflush( stdin ); // **000** add while(ch != '0') { q=p=head; //首先应该先判断p是否为空 //防止p-〉lk的非法访问在VC中空指针好像是注意是好像啊0cccch有可能 //p-〉lk==ch从而出现错误 while ( p != NULL && p->lk != ch )//**222** changed from while(p->lk != ch && p->next != NULL) { q=p; p=p->next; } /* 因为p为空也会推出上面的循环,如果全部都被删除了那么q=p=head都是NULL实际上 //head=head->next是错误的 下面有我写的是自认为正确 这里是原来的去掉 if(p==head) { head=head->next;free(p); } else { if(p->lk == ch) { q->next=p->next; free(p) ; } else printf("can't find it"); } */ /***************************************** 自认为正确的部分*/ if ( p == NULL )//因为p为空也会推出上面的循环 { printf( "Can't find it" ); } else { if ( q == p ) { //就是p==q==head 的情况 head = head->next; free( p ); q = NULL; } else { q->next = p->next; free( p ); } } /***********************************/ q=p=head; printf("\n"); while ( p != NULL)//更改理由和前面的输出打印一样while( p->next != NULL) { printf("%c ",p->lk); p=p->next; } // printf("\n"); q=p=head; printf("\n2:input deleted letter"); fflush(stdin); scanf("%c",&ch); fflush(stdin); } p=head; while( p != NULL)//更改理由和前面的输出打印一样while( p->next != NULL) { printf("%c",p->lk); p=p->next; } q=p=head; printf("\ninput insert letter"); //insert 就看这个插入的```````````````````插入的判断条件大家看看错没(蓝字是) fflush(stdin); scanf("%c",&ch); fflush(stdin); while(ch != '0') { if ( ch < 'a' || ch > 'z' )//add 2 判断输入是否合法 { printf( "\a\n" ); fflush( stdin ); } else { q=p=head; while( p != NULL && p->lk < ch )//更改理由同上面那个while一样的 { q=p; p=p->next; } /*********************************************************/ //更改理由同上 //本人添加的 if ( p == NULL ) { if ( p == q ) { //就是p=q=head=NULL的情况 head = (struct a *) malloc(len); head->lk = ch; head->next = NULL; } else { s=(struct a *) malloc(len); s->lk=ch; s->next = NULL; q->next=s; } } else { if ( p == q ) { //head需要插入 s = (struct a *) malloc(len); s->lk = ch; s->next = head; head = s; } else { s=(struct a *) malloc(len); s->lk=ch; s->next = p; q->next=s; } } /*****************************************************/ /************************************ 下面是原来的去掉 if(p==head) { s=(struct a *) malloc(len); s->lk=ch; s->next=head; p=s; } else { if (p->lk == ch) { printf("inserted is exist"); } else { s=(struct a *) malloc(len); s->lk=ch; s->next=p; q->next=s; p=head; } } printf("\ntest %c\n",p->next->lk); *********************/ printf("\ntest %c\n", ch ); p = head; //add 3************* while( p != NULL) { printf("%c",p->lk); p=p->next; } } //p=head; 去掉 printf("\n2insert a letter"); fflush(stdin); scanf("%c",&ch); } }