クラスの devowelling プログラムをほぼ完成させましたが、リンク リスト ノードから母音がないことを検出しようとした while ループに到達したときに、メモリ アクセス違反エラーが発生しました。私がこれを行った方法はとてつもなく非効率的であることに気づきました(多くの論理ORチェック)が、これを行う他の方法に苦労していました. まったく混乱しています。あまり助けを期待していませんが、ポインタ (:S) は大歓迎です。
https://gist.github.com/3992412
または、コピーして貼り付けます:
#include <iostream>
#include <stdlib.h>
struct NODE {
char letter;
struct NODE *next;
};
int vowelcheck(struct NODE *llist, int num);
void addnode(struct NODE *llist, char c);
void showsentence(struct NODE *llist);
void devowel(struct NODE *llist);
int main(void) {
char charin;
int input = 1;
struct NODE *llist;
int nodeno = 0;
llist = (struct NODE *)malloc(sizeof(struct NODE));
llist->letter = 0;
llist->next = NULL;
while(input != 0) {
printf("\n\n --Disemvoweler--\n");
printf("(0) Quit\n");
printf("(1) Enter sentence\n");
printf("(2) Disemvowel\n");
printf("(3) Display parsed sentence\n");
scanf("%d", &input);
switch(input) {
case 0: //exit
default:
printf("Exiting\n");
break;
case 1: //sentence input
printf("\nEnter sentence, finish sentence with full stop (.) :\n");
do
{
charin=getchar();
addnode(llist, charin);
}
while (charin != '.');
break;
case 2: //remove vowels
printf("Your choice: `Disembvowel'\n");
while(llist->next != NULL) {
devowel(llist);
llist = llist->next;
}
printf("Disembvoweled!\n");
break;
case 3: //show sentence in memory (devoweled or not)
printf("\n Parsed sentence: \n");
showsentence(llist);
break;
}
}
free(llist);
return(0);
}
void showsentence(struct NODE *llist) {
while(llist->next != NULL) { //while not the last link (ie not full stop)
printf("%c ", llist->letter); //print letter
llist = llist->next; //move to next link
}
}
void addnode(struct NODE *llist, char charin) {
while(llist->next != NULL)
llist = llist->next;
llist->next = (struct NODE *)malloc(sizeof(struct NODE));
llist->next->letter = charin;
llist->next->next = NULL;
}
void devowel(struct NODE *llist) {
struct NODE *temp;
temp = (struct NODE *)malloc(sizeof(struct NODE));
if(llist->letter == 'A' || llist->letter == 'a' || llist->letter == 'E' || llist->letter == 'e' || llist->letter == 'I' || llist->letter == 'i' || llist->letter == 'O' || llist->letter == 'o' || llist->letter == 'U' || llist->letter == 'u')
{
/* remove the node */
temp = llist->next;
free(llist);
llist = temp;
} else {
while(llist->next->letter != 'A' || llist->next->letter != 'a' || llist->next->letter != 'E' || llist->next->letter != 'e' || llist->next->letter != 'I' || llist->next->letter != 'i' || llist->next->letter != 'O' || llist->next->letter != 'o' || llist->next->letter != 'U' || llist->next->letter != 'u')
llist = llist->next;
temp = llist->next->next;
free(llist->next);
llist->next = temp;
}
}