我正在做一个基本的linked-list
计划。现在我在main方法中有下面的代码来检查列表操作是否具有预期的结果。
例如,当我在列表的开头插入时,元素为{50, 70, 80, 100, 77, 200, 44, 70, 6, 0}
。我希望列表包含这些元素{0, 6, 70, 44, 200, 77, 100, 80, 70, 50}
,然后我在元素“{1}}中间插入元素,在元素”200“之后,我希望列表为{5, 20, 10, 30, 7, 8, 2, 104, 1, 22}
。当我在列表的末尾插入一个元素并进行删除操作时,我想要一样。
所以,当操作结果和预期结果相等时,我想显示一条消息“Correct”,如果它不同,我想显示“不正确”。但我没有成功做到这一点。你能帮助理解如何实现这一目标吗?
这是我的代码,我评论的是我试图实现第一个案例的目标(在开头插入):
{0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50}
Restant代码,这段代码正常工作,我只是对主要方法有疑问:
int main()
{
int i=0;
int listsize=10;
int arrBegining[] = {50, 70, 80, 100, 77, 200, 44, 70, 6, 0};
int arrBeginingExpected[] = {0, 6, 70, 44, 200, 77, 100, 80, 70, 50};
int arrMiddle[] = {5, 20, 10, 30, 7, 8, 2, 104, 1, 22};
int arrMiddleExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50};
int arrEnd[] = {40, 30, 20, 1, 7, 76, 4 , 0, 80, 2};
int arrEndExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 76, 4, 0, 80, 2};
int arrDeleteSpecificExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 4 , 0, 80 ,2};
int arrDeleteFromEndExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 4, 0};
// int newArr[] = {};
for(i=0;i<listsize;i++){
insert_at_begning(arrBegining[i]);
// newArr[i] = arrBegining[i];
}
// if(newArr == arrBegining){
// printf("Correct");
// }
// else{
// printf(Incorrect);
// }
for(i=0;i<listsize;i++){
insert_at_middle(arrMiddle[i], 200);
}
for(i=0;i<listsize;i++){
insert_at_end(arrEnd[i]);
}
for(i=0;i<listsize;i++){
delete_from_middle(76);
}
for(i=0;i<2;i++){
delete_from_end();
}
display_file(FILEDIR);
return 0;
}
答案 0 :(得分:0)
您可以使用模块化方法:创建一个新函数,如果&#34;更正&#34;则返回布尔值true。如果不是,则为假。通过&#34;预期列表&#34;作为函数的参数,并将编辑后的列表声明为全局变量,或者将其作为参数传递;我建议你也把它作为参数传递给我。在函数体中,循环遍历一个数组的所有元素,并使用嵌套循环检查特定元素是否存在,嵌套循环仅在函数末尾返回true,如果在另一个数组中未找到一个元素,则返回false。 所以基本上原型如下:
bool check(int expected [],int list []);
希望有所帮助。
答案 1 :(得分:0)
首先,您需要创建一个链接列表,为此我们应该定义一个新类型,它是我们列表的成员,可以链接到其他成员。它是这样的:
typedef struct SMember{
int data;
struct SMember *next;
struct SMember *previous;
}Member;
现在我们应该有一个标题列表来计算并获得插入要求的第一个和最后一个成员,如下所示:
typedef struct sList{
int count;
struct SMember *first;
struct SMember *last;
}List;
所以我们可以使用它:
#include <stdio.h>
typedef struct SMember{
int data;
struct SMember *next;
struct SMember *previous;
}Member;
typedef struct SListHeader{
int count;
struct SMember *first;
struct SMember *last;
}ListHeader;
void InsertAtBegning(int value, ListHeader *list)
{
Member *newMember = (Member *)calloc(1, sizeof(Member));
newMember->next=NULL;
newMember->previous=NULL;
newMember->data = value;
if(list->count==0)
{
list->count = 1;
list->first = newMember;
list->last = newMember;
}
else{
Member *tempMember;
list->count++;
tempMember = list->first;
list->first = newMember;
newMember->next = tempMember;
tempMember->previous = newMember;
}
}
void InsertAtMiddle(int value, int middle, ListHeader *list)
{
Member *newMember = (Member *)calloc(1, sizeof(Member));
newMember->next=NULL;
newMember->previous=NULL;
newMember->data = value;
if(list->count==0)
{
list->count = 1;
list->first = newMember;
list->last = newMember;
return;
}
else{
int i;
Member *tempMember;
for(i=0, tempMember = list->first; i < list->count; i++, tempMember=tempMember->next)
if(tempMember->data == middle)
{
if(tempMember->next != NULL)
{
Member *tempMemberNext = tempMember->next;
tempMember->next = newMember;
newMember->next = tempMemberNext;
newMember->previous = tempMember;
tempMemberNext->previous = newMember;
}
else{
tempMember->next = newMember;
newMember->previous = tempMember;
list->last = newMember;
}
list->count++;
return;
}
//if we dont find the middle member we dont insert this member!
free(newMember);
}
}
void InsertAtEnd(int value, ListHeader *list)
{
Member *newMember = (Member *)calloc(1, sizeof(Member));
newMember->next=NULL;
newMember->previous=NULL;
newMember->data = value;
if(list->count==0)
{
list->count = 1;
list->first = newMember;
list->last = newMember;
}
else{
Member *tempMember;
list->count++;
tempMember = list->last;
list->last = newMember;
newMember->previous = tempMember;
tempMember->next = newMember;
}
}
void DeleteFromMiddle(int middle, ListHeader *list)
{
if(list->count==0)
{
return;
}
int i;
Member *tempMember;
for(i=0, tempMember = list->first; i < list->count; i++, tempMember=tempMember->next)
if(tempMember->data == middle)
{
if(tempMember->next != NULL && tempMember->previous != NULL)
{
Member *tempMemberNext = tempMember->next;
Member *tempMemberPrevious = tempMember->previous;
tempMemberPrevious->next = tempMemberNext;
tempMemberNext->previous = tempMemberPrevious;
}
else if(tempMember->previous == NULL && tempMember->next == NULL)
{
list->first = NULL;
list->last = NULL;
}
else if(tempMember->next == NULL)
{
Member *tempMemberPrevious = tempMember->previous;
tempMemberPrevious->next = NULL;
list->last = tempMemberPrevious;
}
else if(tempMember->previous == NULL)
{
Member *tempMemberNext = tempMember->next;
tempMemberNext->previous = NULL;
list->first = tempMemberNext;
}
free(tempMember);
list->count--;
return;
}
}
void DeleteFromEnd(ListHeader *list)
{
if(list->count==0)
{
return;
}
else{
Member *lastMember;
list->count--;
lastMember = list->last;
list->last = lastMember->previous;
if(lastMember->previous != NULL)
{
Member *beforeLastMember = lastMember->previous;
beforeLastMember->next = NULL;
}
free(lastMember);
}
}
void PrintList(ListHeader *list)
{
int i;
Member *tempMember;
for(i=0, tempMember = list->first; i<list->count; i++, tempMember = tempMember->next)
{
printf("Member [%d] = %d\n", i, tempMember->data);
}
}
int main(int argc, char *argv[])
{
ListHeader list;
list.count = 0;
list.first = NULL;
list.last = NULL;
InsertAtBegning(1, &list);
InsertAtBegning(2, &list);
InsertAtBegning(3, &list);
InsertAtMiddle(4, 1, &list);
InsertAtMiddle(5, 2, &list);
InsertAtMiddle(6, 5, &list);
InsertAtEnd(7, &list);
InsertAtEnd(8, &list);
InsertAtEnd(9, &list);
printf("==================================1\n");
PrintList(&list);
DeleteFromMiddle(1, &list);
DeleteFromMiddle(2, &list);
DeleteFromMiddle(3, &list);
DeleteFromMiddle(4, &list);
DeleteFromMiddle(5, &list);
printf("==================================2\n");
PrintList(&list);
DeleteFromMiddle(6, &list);
DeleteFromMiddle(7, &list);
DeleteFromMiddle(8, &list);
DeleteFromMiddle(9, &list);
printf("==================================3\n");
PrintList(&list);
InsertAtBegning(1, &list);
InsertAtBegning(2, &list);
InsertAtBegning(3, &list);
DeleteFromEnd(&list);
printf("==================================4\n");
PrintList(&list);
}
=============================================== ============
修改强>
=============================================== ============
在您发表评论后,我对您的主要内容进行了一些更改,并添加了两个功能,
请查看
#include <stdio.h>
typedef struct node
{
int data;
struct node *next;
};
struct node *head;
void insert_at_begning(int value)
{
struct node *var;
var=(struct node *)malloc(sizeof (struct node));
var->data=value;
if(head==NULL)
{
head=var;
head->next=NULL;
}
else
{
var->next=head;
head=var;
}
}
void insert_at_end(int value)
{
struct node *temp, *var;
temp=head;
var=(struct node *)malloc(sizeof (struct node));
var->data=value;
if(head==NULL)
{
head=var;
head->next=NULL;
}
else
{
while(temp->next!=NULL)
{
temp=temp->next;
}
var->next=NULL;
temp->next=var;
}
}
void insert_at_middle(int value, int loc)
{
struct node *var,*var2,*temp;
var=(struct node *)malloc(sizeof (struct node));
var->data=value;
temp=head;
if(head==NULL)
{
head=var;
head->next=NULL;
}
else
{
while(temp->data!=loc)
{
temp=temp->next;
}
var2=temp->next;
temp->next=var;
var->next=var2;
}
}
int delete_from_middle(int value)
{
struct node *temp,*var;
temp=head;
while(temp!=NULL)
{
if(temp->data == value)
{
if(temp==head)
{
head=temp->next;
free(temp);
return 0;
}
else
{
var->next=temp->next;
free(temp);
return 0;
}
}
else
{
var=temp;
temp=temp->next;
}
}
printf("data deleted from list is %d\n",value);
}
int delete_from_end()
{
struct node *var, *temp;
temp=head;
while(temp->next != NULL)
{
var=temp;
temp=temp->next;
}
if(temp ==head)
{
head=temp->next;
free(temp);
return 0;
}
printf("data deleted from list is %d\n",temp->data);
var->next=NULL;
free(temp);
return 0;
}
int check_results(int expected[], int count)
{
struct node *temp;
int i;
if(head==NULL)
return -1;
if(expected[0]!=head->data)
return -1;
i=1;
temp = head->next;
while(temp->next != NULL && i<count)
{
temp = temp->next;
if(expected[i]!=temp->data)
return -1;
i++;
}
return 0;
}
void printResults()
{
struct node *temp;
if(head==NULL)
return;
temp = head;
printf("Results:");
printf(" %d ", head->data);
temp = head;
while(temp->next != NULL)
{
temp = temp->next;
printf(" %d ", temp->data);
}
printf("\n");
}
int main()
{
int i=0;
int listsize=10;
int arrBegining[] = {50, 70, 80, 100, 77, 200, 44, 70, 6, 0};
int arrBeginingExpected[] = {0, 6, 70, 44, 200, 77, 100, 80, 70, 50};
int arrMiddle[] = {5, 20, 10, 30, 7, 8, 2, 104, 1, 22};
int arrMiddleExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50};
int arrEnd[] = {40, 30, 20, 1, 7, 76, 4 , 0, 80, 2};
int arrEndExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 76, 4, 0, 80, 2};
int arrDeleteSpecificExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 4 , 0, 80 ,2};
int arrDeleteFromEndExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 4, 0};
// int newArr[] = {};
for(i=0; i<listsize; i++)
{
insert_at_begning(arrBegining[i]);
}
printResults();
if(check_results(arrBeginingExpected, 10))
printf("correct!\n");
else
printf("incorrect!\n");
for(i=0; i<listsize; i++)
{
insert_at_middle(arrMiddle[i], 200);
}
printResults();
if(check_results(arrMiddleExpected, 20))
printf("correct!\n");
else
printf("incorrect!\n");
for(i=0; i<listsize; i++)
{
insert_at_end(arrEnd[i]);
}
printResults();
if(check_results(arrEndExpected, 30))
printf("correct!\n");
else
printf("incorrect!\n");
for(i=0; i<listsize; i++)
{
delete_from_middle(76);
}
printResults();
if(check_results(arrDeleteSpecificExpected, 29))
printf("correct!\n");
else
printf("incorrect!\n");
for(i=0; i<2; i++)
{
delete_from_end();
}
printResults();
if(check_results(arrDeleteFromEndExpected, 27))
printf("correct!\n");
else
printf("incorrect!\n");
//display_file(FILEDIR);
return 0;
}
结果是:
Results: 0 6 70 44 200 77 100 80 70 50
correct!
Results: 0 6 70 44 200 22 1 104 2 8 7 30 10 20 5 77 100 80 70 50
correct!
Results: 0 6 70 44 200 22 1 104 2 8 7 30 10 20 5 77 100 80 70 50 40 30 20 1 7 76 4 0 80 2
correct!
data deleted from list is 76
data deleted from list is 76
data deleted from list is 76
data deleted from list is 76
data deleted from list is 76
data deleted from list is 76
data deleted from list is 76
data deleted from list is 76
data deleted from list is 76
Results: 0 6 70 44 200 22 1 104 2 8 7 30 10 20 5 77 100 80 70 50 40 30 20 1 7 4 0 80 2
correct!
data deleted from list is 2
data deleted from list is 80
Results: 0 6 70 44 200 22 1 104 2 8 7 30 10 20 5 77 100 80 70 50 40 30 20 1 7 4 0
correct!