高质量的代码,面试题,最贴近标准答案的代码到底是什么?
typedef struct LNode
{
ElemType data;
struct LNode * next;
}LNode,*LinkList;
编写算法从 有序表A中删除所有和 有序表B中元素相同的节点。
要求:
1.代码可读性
2.健壮性
时间:30min
[解决办法]
tag 和 类型不要共享标识符,提高可读性。
typedef struct tagLNode
{
ElemType data;
struct tagLNode * next;
}LNode,*LinkList;
[解决办法]
第一次答题,见笑。输入的数字可以重复。运行过了,没什么问题。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode * next;
}LNode_t;
int insertToList(LNode_t *list_a,int val_i)
{
LNode_t *newNode = NULL;
newNode = (LNode_t*)malloc(sizeof(LNode_t));
newNode->data = val_i;
newNode->next = NULL;
(list_a)->next = newNode;
return 0;
}
int insertListHead(LNode_t *list_a,int val_i)
{
list_a->data = val_i;
list_a->next = NULL;
return 0;
}
int createList(LNode_t *list)
{
int input = 0;
int count = 0;
printf("please input numbers ,seprater with space(example:1 2 3……)\n:");
do
{
scanf("%d",&input);
count++;
if(count == 1)
insertListHead(list,input);
else
{
insertToList(list,input);
list = (list)->next;
}
input = 0;
}while(getchar()!= '\n');
return 0;
}
LNode_t * deleteNodeViaValue(LNode_t ** list,int value)
{
LNode_t * list_1 = NULL;
LNode_t * list_2 = NULL;
LNode_t * list_3 = NULL;
if(list == NULL && *list == NULL)
return list_3;
list_1 = *list;
while(list_1->data != value &&list_1->next != NULL)
{
list_2 = (list_1);
list_1 = (list_1)->next;
list_3 = (list_1)->next;
}
if(list_1->data == value)
{
if(list_1 == *list)
{
*list = list_1->next;
list_3 = list_1->next;
}
else
{
list_2->next = list_1->next;
list_3 = list_1->next;
}
free(list_1);
list_1 = NULL;
}
return list_3;
}
LNode_t * delteNode(LNode_t * list_a, LNode_t * list_b)
{
LNode_t * list = NULL;
LNode_t * listEnd = NULL;
list = list_b;
if(list_a == NULL
[解决办法]
list_b == NULL )
{
return list_a;
}
while(list != NULL)
{
do
{
listEnd = deleteNodeViaValue(&list_a,list->data);
}while(listEnd != NULL);
list = list->next;
};
return list_a;
}
#define INVAILD_DATE 0xFFFFFFFF
int main()
{
LNode_t *list_a;
LNode_t *list_b;
LNode_t * result;
list_a = (LNode_t*)malloc(sizeof(LNode_t));
list_b = (LNode_t*)malloc(sizeof(LNode_t));
memset(list_a , 0, sizeof(LNode_t));
memset(list_b , 0, sizeof(LNode_t));
list_a->data = 0xffffffff;
createList(list_a);
createList(list_b);
result = delteNode(list_a,list_b);
printf(" list after deleting:");
if(result == NULL)
{
printf("empty!!\r\n");
return 0;
}
while(result != NULL)
{
printf("%d ",result->data);
result = result->next;
}
printf("\r\n");
return 0;
}
[解决办法]
[解决办法]
1. A和B的有序规则一样吗?
2. 可以修改B中元素的顺序吗?
[解决办法]
随便写了一下,代码比较简略粗糙,代码中是假定按照从小到大排序的,你可以考虑其他情况
void DeleteTheSame(LinkList List_A,LinkList List_B)
{
LinkList p_A=List_A;
LinkList p_B=List_B;
LinkList temp;
while(p_A&&p_B)
{
if(p_A->data<p_B->data)//A往前走
{
temp=p_A;
p_A=p_A->next;
}
else if(p_A->data==p_B->data)//从A中删除该元素,并将A往前走
{
if(p_A==List_A)//头结点
{
List_A=List_A->next;
p_A=p_A->next;
}
else
{
temp->next=p_A->next;
p_A=p_A->next;
}
}
else if(p_A->data>p_B->data)//B往前走
{
p_B=p_B->next;
}
}
}