注册 登录
编程论坛 数据结构与算法

不懂,这个代码哪里错了,怎么改

我的小猪猪 发布于 2016-10-02 13:57, 3180 次点击
#include <stdio.h>
#include <stdlib.h>

#define ERROR NULL
typedef enum { FALSE, TRUE } BOOL;
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

List MakeEmpty();
Position Find(List L, ElementType X);
bool Insert(List L, ElementType X, Position P);
bool Delete(List L, Position P);

int main()
{
    List L;
    ElementType X;
    Position P;
    int N;
    bool flag;

    L = MakeEmpty();
    scanf("%d", &N);
    while (N--) {
        scanf("%d", &X);
        flag = Insert(L, X, L->Next);
        if (flag == false) printf("Wrong Answer\n");
    }
    scanf("%d", &N);
    while (N--) {
        scanf("%d", &X);
        P = Find(L, X);
        if (P == ERROR)
            printf("Finding Error: %d is not in.\n", X);
        else {
            flag = Delete(L, P);
            printf("%d is found and deleted.\n", X);
            if (flag == false)
                printf("Wrong Answer.\n");
        }
    }
    flag = Insert(L, X, NULL);
    if (flag == false) printf("Wrong Answer\n");
    else
        printf("%d is inserted as the last element.\n", X);
    P = (Position)malloc(sizeof(struct LNode));
    flag = Insert(L, X, P);
    if (flag == true) printf("Wrong Answer\n");
    flag = Delete(L, P);
    if (flag == true) printf("Wrong Answer\n");
    for (P = L->Next; P; P = P->Next) printf("%d ", P->Data);
    return 0;
}
List MakeEmpty(){
    List L;
    L = (List)malloc(sizeof(struct LNode));
    L->Next = NULL;
    return L;

}
Position Find(List L, ElementType X){
    Position p;
    if (L == NULL)
        return ERROR;
    while (L != NULL){
        if (L->Data == X){
            p = L;
            return p;
        }
        L = L->Next;
    }
    return ERROR;

}
bool Insert(List L, ElementType X, Position P){
    List tmp = L;
    List apply = NULL;
    if (L == P){
        apply = (List)malloc(sizeof(struct LNode));
        apply->Data = X;
        apply->Next = P;
        tmp = apply;
        return tmp;
    }
    while (L->Next != P && L->Next != NULL){
        L = L->Next;
        if (L->Next == NULL&&P != NULL){
            printf("Wrong Position for Insertion");
            return ERROR;
        }
        else{
            apply = (List)malloc(sizeof(struct LNode));
            apply->Data = X;
            L->Next = apply;
            apply->Next = P;
            return tmp;

        }
    }
  bool Delete(List L, Position P){   
         List tmp = L;
        if (L == NULL || P == NULL){
            printf("Wrong Position for Insertion");
            return ERROR;
        }
        if (L = P){
            tmp = L->Next;
            free(L);
            return tmp;
        }
        while (L->Next != P&&L->Next != NULL)
            L = L->Next;
        if (L->Next == NULL){
            printf("Wrong Position for Insertion");
            return ERROR;
        }
        else{
            L->Next = P->Next;
            free(P);
            return tmp;
        }
    }









2 回复
#2
书生牛犊2016-10-02 18:05
编译报错:在bool Delete(List L,Position P){  前一行少了一个}  也就是Insert()函数的花括号不匹配。不上就没错了。
..
至于如果运行结果和你想要的不一样的话,我就无能为力了。第一没题目,第二没测试样例,,,恕我无能为力。


#3
陈CDG2016-11-05 00:04
我帮你标出了错误的地方,已经可以运行,至于功能,和你写的算法有关(自己修改)
只有本站会员才能查看附件,请 登录

程序代码:

#include <stdio.h>
#include <stdlib.h>

#define ERROR NULL
typedef enum { FALSE, TRUE } BOOL;
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

List MakeEmpty();
Position Find(List L, ElementType X);
bool Insert(List L, ElementType X, Position P);
bool Del(List L, ElementType X);

int main()
{
    List L;
    ElementType X;
    Position P;
    int N;
    bool flag;

    L = MakeEmpty();
    scanf("%d", &N);
    while (N--) {
        scanf("%d", &X);
        flag = Insert(L, X, L->Next);
        if (flag == false) printf("Wrong Answer\n");
    }
    scanf("%d", &N);
    while (N--) {
        scanf("%d", &X);
        P = Find(L, X);//既然都找到地址了那就可以直接删除,为何还要多此一举,再用delete来删
        if (P == ERROR)
            printf("Finding Error: %d is not in.\n", X);
        else {
//            flag = Delete(L, P);//你的Delete是错的,其实你直接可以用Find 实现删除的
            flag = Del(L, X);//我只是用Find的代码加上个删除实现你想实现的功能
            printf("%d is found and deleted.\n", X);
          if (flag == false)
                printf("Wrong Answer.\n");
        }
    }
    flag = Insert(L, X, NULL);
    if (flag == false) printf("Wrong Answer\n");
    else
        printf("%d is inserted as the last element.\n", X);
    P = (Position)malloc(sizeof(struct LNode));
    flag = Insert(L, X, P);
    if (flag == true) printf("Wrong Answer\n");
    flag = Del(L, X);
  if (flag == true) printf("Wrong Answer\n");
  for (P = L->Next; P; P = P->Next) printf("%d ", P->Data);
    return 0;
}
List MakeEmpty(){
    List L;
    L = (List)malloc(sizeof(struct LNode));
    L->Next = NULL;
    return L;

}
Position Find(List L, ElementType X){
    Position p = NULL;//
    if (L == NULL)
        return ERROR;
    while (L != NULL){
        if (L->Data == X){
            p = L;
           // return p;//
        }
        else//这里应该加个else
        L = L->Next;
    }
    if(NULL == p)
    {
        printf("元素不存在!\n");
        return ERROR;//如果找完整个链表都找不到,返回eorro
    }
    else
        return p;//否则就是找到了,返回地址

}
bool Insert(List L, ElementType X, Position P){
    List tmp = L;
    List apply = NULL;
    if (L == P){
        apply = (List)malloc(sizeof(struct LNode));
        apply->Data = X;
        apply->Next = P;
        tmp = apply;
        //return tmp;//既然函数定义为bool型,返回值就不能是List型
        return true;
    }
    while (L->Next != P && L->Next != NULL){
        L = L->Next;
        if (L->Next == NULL&&P != NULL){
            printf("Wrong Position for Insertion");
            return ERROR;
        }
        else{
            apply = (List)malloc(sizeof(struct LNode));
            apply->Data = X;
            L->Next = apply;
            apply->Next = P;
            //return tmp;//既然函数定义为bool型,返回值就不能是List型
        return true;

        }
    }


}
bool Del(List L, ElementType X)

 {   
      /*  List tmp = L;
        if (L == NULL || P == NULL){
            printf("Wrong Position for Insertion");
            return ERROR;
        }
        if (L = P){
            tmp = L->Next;
            free(L);
            //return tmp;//既然函数定义为bool型,返回值就不能是List型
        return true;
        }
        while (L->Next != P&&L->Next != NULL)
            L = L->Next;
        if (L->Next == NULL){
            printf("Wrong Position for Insertion");
            return ERROR;
        }
        else{
            L->Next = P->Next;
            free(P);
            //return tmp;//既然函数定义为bool型,返回值就不能是List型
        return true;
        }
*/
        
    Position p = NULL;//
    Position q = NULL;
    if (L == NULL)
        return false;
    while (L->Next != NULL){
        if (L->Next->Data == X){
            p = L->Next;
           // return p;//
        }
        else//这里应该加个else
        L = L->Next;
    }
    if(NULL == p)
    {
        printf("元素不存在!\n");
        return false;//如果找完整个链表都找不到,返回eorro
    }
    else//    return p;//否则就是找到了,返回地址
    {
        q = L;
        L->Next = p->Next;
        free(p);
        return true;
    }


}

我只想提醒楼主,一个没有注释的代码是很难让人看懂得,你如果以后还想让人帮你找错,记得写好注释,这也是程序员最基本的素质要求,不然没人愿意读你的程序
1