C:即使条件仍然满足,循环也会弹出
这是一个用C编写的链接列表的演示 描述:代码是关于操作链接列表,如插入、删除、显示链接列表C:即使条件仍然满足,循环也会弹出,c,loops,linked-list,C,Loops,Linked List,这是一个用C编写的链接列表的演示 描述:代码是关于操作链接列表,如插入、删除、显示链接列表 // ============================== // Linked List Demo // ============================== // 1. Insert to head // 2. Delete elements by value // 3. Display all elements // 4. Search an element // 5. Delete
// ==============================
// Linked List Demo
// ==============================
// 1. Insert to head
// 2. Delete elements by value
// 3. Display all elements
// 4. Search an element
// 5. Delete an element by position
// 6. Exit
// ==============================
// Your choice:
#include<stdio.h>
#include<stdlib.h>
struct Node{
int value;
struct Node *next;
};
typedef struct Node intLinkedList;
int insertToHead();
void display(intLinkedList *head);
void displayForLoop(intLinkedList *head);
int deleteFromHead(intLinkedList **head);
int delete(int value, intLinkedList **head);
int indexOf(int value, intLinkedList *head);
void menu();
void menu(){
char* mainMenu[] = {"Insert to head", "Delete", "Display", \
"Search Element", "Delete by position", "Exit"};
printf("=====================================\n");
for(int i = 0; i < 6; i++)
{
printf("%d. %s \n", i + 1, mainMenu[i]);
}
printf("=====================================\n");
}
int main(){
int choice;
int value;
intLinkedList *head;
do{
menu();
printf("#Choice: ");
scanf("%d", &choice);
printf("--> %d", choice);
switch(choice){
case 1:
printf("Input new Value to Linked List: ");
scanf("%d", &value);
insertToHead(value, &head);
break;
case 2:
printf("Input new Value to delete : ");
scanf("%d", &value);
if(delete(value, &head)){
printf("%d removed from linked list \n", value);
}else{
printf(" %d not in linked list \n", value);
}
break;
case 3:
printf("Display all elements \n");
display(head);
break;
case 4:
printf("Input value to search: ");
scanf("%d", &value);
int found = indexOf(value, head);
if( found < 0){
printf("%d is isn't in linked list ", value);
}else{
printf("%d is in linked list at %d positino \n", value, found);
}
break;
case 5:
printf("Delete by position : ");
break;
case 6:
printf("EXIT..");
return 0;
default:
printf(": \n");
break;
}
}while(choice != 6);
}
int insertToHead(int value, intLinkedList **head){
intLinkedList *newElement;
newElement = (intLinkedList*)malloc(sizeof(intLinkedList));
newElement -> value = value;
newElement -> next = *head;
*head = newElement;
return 1;
}
void displayForLoop(intLinkedList *head){
intLinkedList *iterator;
for(iterator=head; iterator!=NULL; iterator=iterator->next){
printf("|value: %d| ->", iterator->value);
}
printf(" NULL\n");
}
void display(intLinkedList *head){
intLinkedList *iterator;
iterator = head;
while( iterator != NULL){
printf("|value : %d| -> ", iterator -> value);
iterator = iterator -> next;
}
printf("NULL \n");
}
int deleteFromHead(intLinkedList **head){
if( *head == NULL){
return 0;
}
intLinkedList *del;
del = *head;
*head = del -> next;
free(del);
return 1;
}
int delete(int value, intLinkedList **head){
intLinkedList *current;
intLinkedList *pre;
current = *head;
pre = *head;
int deleted = 0;
if(current->value == value){
printf("get here\n");
deleteFromHead(head);
return 1;
}
while(current != NULL){
if(current->value == value){
deleted = 1;
if(current==*head){
deleteFromHead(head);
current = *head;
pre = *head;
}else{
pre->next = current->next;
free(current);
current = pre->next;
}
continue;
}
pre = current;
current = current->next;
}
return deleted;
}
int indexOf(int value, intLinkedList *head){
intLinkedList *iterator;
int i;
for( iterator = head, i = 0; iterator != NULL; iterator = iterator -> next, i++){
if(iterator -> value = value){
return i;
}
}
return -1;
}
问题:
// ==============================
// Linked List Demo
// ==============================
// 1. Insert to head
// 2. Delete elements by value
// 3. Display all elements
// 4. Search an element
// 5. Delete an element by position
// 6. Exit
// ==============================
// Your choice:
#include<stdio.h>
#include<stdlib.h>
struct Node{
int value;
struct Node *next;
};
typedef struct Node intLinkedList;
int insertToHead();
void display(intLinkedList *head);
void displayForLoop(intLinkedList *head);
int deleteFromHead(intLinkedList **head);
int delete(int value, intLinkedList **head);
int indexOf(int value, intLinkedList *head);
void menu();
void menu(){
char* mainMenu[] = {"Insert to head", "Delete", "Display", \
"Search Element", "Delete by position", "Exit"};
printf("=====================================\n");
for(int i = 0; i < 6; i++)
{
printf("%d. %s \n", i + 1, mainMenu[i]);
}
printf("=====================================\n");
}
int main(){
int choice;
int value;
intLinkedList *head;
do{
menu();
printf("#Choice: ");
scanf("%d", &choice);
printf("--> %d", choice);
switch(choice){
case 1:
printf("Input new Value to Linked List: ");
scanf("%d", &value);
insertToHead(value, &head);
break;
case 2:
printf("Input new Value to delete : ");
scanf("%d", &value);
if(delete(value, &head)){
printf("%d removed from linked list \n", value);
}else{
printf(" %d not in linked list \n", value);
}
break;
case 3:
printf("Display all elements \n");
display(head);
break;
case 4:
printf("Input value to search: ");
scanf("%d", &value);
int found = indexOf(value, head);
if( found < 0){
printf("%d is isn't in linked list ", value);
}else{
printf("%d is in linked list at %d positino \n", value, found);
}
break;
case 5:
printf("Delete by position : ");
break;
case 6:
printf("EXIT..");
return 0;
default:
printf(": \n");
break;
}
}while(choice != 6);
}
int insertToHead(int value, intLinkedList **head){
intLinkedList *newElement;
newElement = (intLinkedList*)malloc(sizeof(intLinkedList));
newElement -> value = value;
newElement -> next = *head;
*head = newElement;
return 1;
}
void displayForLoop(intLinkedList *head){
intLinkedList *iterator;
for(iterator=head; iterator!=NULL; iterator=iterator->next){
printf("|value: %d| ->", iterator->value);
}
printf(" NULL\n");
}
void display(intLinkedList *head){
intLinkedList *iterator;
iterator = head;
while( iterator != NULL){
printf("|value : %d| -> ", iterator -> value);
iterator = iterator -> next;
}
printf("NULL \n");
}
int deleteFromHead(intLinkedList **head){
if( *head == NULL){
return 0;
}
intLinkedList *del;
del = *head;
*head = del -> next;
free(del);
return 1;
}
int delete(int value, intLinkedList **head){
intLinkedList *current;
intLinkedList *pre;
current = *head;
pre = *head;
int deleted = 0;
if(current->value == value){
printf("get here\n");
deleteFromHead(head);
return 1;
}
while(current != NULL){
if(current->value == value){
deleted = 1;
if(current==*head){
deleteFromHead(head);
current = *head;
pre = *head;
}else{
pre->next = current->next;
free(current);
current = pre->next;
}
continue;
}
pre = current;
current = current->next;
}
return deleted;
}
int indexOf(int value, intLinkedList *head){
intLinkedList *iterator;
int i;
for( iterator = head, i = 0; iterator != NULL; iterator = iterator -> next, i++){
if(iterator -> value = value){
return i;
}
}
return -1;
}
//==============================
//链表演示
// ==============================
// 1. 插入到头部
// 2. 按值删除元素
// 3. 显示所有元素
// 4. 搜索元素
// 5. 按位置删除元素
// 6. 出口
// ==============================
//您的选择:
#包括
#包括
结构节点{
int值;
结构节点*下一步;
};
typedef结构节点intLinkedList;
int insertToHead();
无效显示(intLinkedList*头);
void displayForLoop(intLinkedList*头);
int deleteFromHead(intLinkedList**head);
int delete(int值,intLinkedList**head);
int indexOf(int值,intLinkedList*head);
无效菜单();
无效菜单(){
char*main菜单[]={“插入到头部”、“删除”、“显示”\
“搜索元素”、“按位置删除”、“退出”};
printf(“==========================================================\n”);
对于(int i=0;i<6;i++)
{
printf(“%d.%s\n”,i+1,主菜单[i]);
}
printf(“==========================================================\n”);
}
int main(){
智力选择;
int值;
intLinkedList*头;
做{
菜单();
printf(“#选择:”);
scanf(“%d”,选择(&C);
printf(“-->%d”,选项);
开关(选择){
案例1:
printf(“将新值输入到链接列表:”);
scanf(“%d”,和值);
插入头(值和头);
打破
案例2:
printf(“输入要删除的新值:”);
scanf(“%d”,和值);
如果(删除(值和标题)){
printf(“%d已从链接列表中删除,\n”,值);
}否则{
printf(“%d不在链接列表中\n”,值);
}
打破
案例3:
printf(“显示所有元素\n”);
显示器(头部);
打破
案例4:
printf(“要搜索的输入值:”);
scanf(“%d”,和值);
int found=indexOf(值,头);
如果(发现<0){
printf(“%d不在链表中”,值);
}否则{
printf(“%d位于链接列表中的%d位置,\n”,找到值);
}
打破
案例5:
printf(“按位置删除:”);
打破
案例6:
printf(“退出”);
返回0;
违约:
printf(“:\n”);
打破
}
}while(选项!=6);
}
int insertToHead(int值,intLinkedList**head){
intLinkedList*新元素;
newElement=(intLinkedList*)malloc(sizeof(intLinkedList));
新元素->值=值;
新元素->下一步=*头部;
*head=新元素;
返回1;
}
void displayForLoop(intLinkedList*头){
intLinkedList*迭代器;
for(迭代器=head;迭代器!=NULL;迭代器=iterator->next){
printf(“|值:%d |->”,迭代器->值);
}
printf(“NULL\n”);
}
无效显示(intLinkedList*头){
intLinkedList*迭代器;
迭代器=头;
while(迭代器!=NULL){
printf(“|值:%d |->”,迭代器->值);
迭代器=迭代器->下一步;
}
printf(“NULL\n”);
}
int deleteFromHead(intLinkedList**head){
如果(*head==NULL){
返回0;
}
intLinkedList*del;
del=*头;
*head=del->next;
免费(del);
返回1;
}
int delete(int值,intLinkedList**head){
intLinkedList*当前;
intLinkedList*pre;
电流=*水头;
pre=*头;
int=0;
如果(当前->值==值){
printf(“到这里来\n”);
删除头(头);
返回1;
}
while(当前!=NULL){
如果(当前->值==值){
删除=1;
如果(当前==*头){
删除头(头);
电流=*水头;
pre=*头;
}否则{
前->下一步=当前->下一步;
自由(电流);
当前=前->下一步;
}
继续;
}
pre=电流;
当前=当前->下一步;
}
返回已删除;
}
int indexOf(int值,intLinkedList*head){
intLinkedList*迭代器;
int i;
for(iterator=head,i=0;iterator!=NULL;iterator=iterator->next,i++){
如果(迭代器->值=值){
返回i;
}
}
返回-1;
}
您通过不初始化头来调用未定义的行为。考虑第一次插入元素时,调用<代码> INSERTATOTHOME/<代码>。然后执行newElement->next=*head代码><代码>头
未初始化,因此*头
是垃圾,您的第一个元素->下一个
值被“初始化”为某个不确定的值。例如,您的displayForLoop
函数会一直循环,直到->next
为空。这可能不是唯一的问题,但肯定是一个问题。每当您遍历链接列表,寻找->next==NULL
作为列表末尾的标记时,这将导致问题。使用intLinkedList*head=NULL初始化head
代码>来解决此问题。是必需的。首先使用调试器单步检查代码。这是一个“完整的”、“可验证的示例”,你的意思是什么?@VeronykaMunteanu它肯定是完整的、可验证的,但不是min