微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在给定代码中实现链表

如何解决无法在给定代码中实现链表

我想根据 partNumber 以升序插入数据。 当在main中调用函数时,则在第一个位置成功添加节点。但是在第二次调用函数时,插入出现了一些问题,我无法弄清楚。当我输入值(在第二次调用中)时,出现错误 进程在 8.277 秒后退出,返回值 3221225477

typedef struct part {
    int partNumber;
    char partName[200];
    int partQuantity;
    struct part *nextPart;
} Part;
Part *inventory = NULL;

void insertPart();

int
main(int argc,char *argv[])
{
    insertPart();
    insertPart();
    insertPart();
    insertPart();
    return 0;
}

void
insertPart()
{
    Part *tempPart,*traversePart,*swapPart;
    int counter = 0;

    traversePart = inventory;
    tempPart = (Part *) malloc(sizeof(Part *));

    printf("Enter the Part Number\n");
    scanf("%d",&(tempPart->partNumber));
    getchar();

    printf("Enter the Part Name\n");
    fgets(tempPart->partName,200,stdin);

    printf("Enter the Part Quantity\n");
    scanf("%d",&(tempPart->partQuantity));
    getchar();

    if (inventory == NULL) {
        inventory = tempPart;
        printf("Part added at the first position.\n");
    }
    else {

        while (traversePart->nextPart->partNumber < tempPart->partNumber) {
            counter++;
            traversePart = traversePart->nextPart;
            if (traversePart->nextPart == NULL) {
                break;
            }
        }
        if (counter == 0) {
            swapPart = inventory;
            inventory = tempPart;
            tempPart->nextPart = swapPart;
        }
        else if (traversePart->nextPart == NULL) {
            traversePart->nextPart = tempPart;
        }
        else {
            swapPart = traversePart->nextPart;
            traversePart->nextPart = tempPart;
            tempPart->nextPart = swapPart;
        }
    }
    printf("Element added at position : %d",counter);
}

解决方法

问题是 traversePart->nextPart->partNumber traversePart->nextPart 没有指代任何东西或者它没有保存任何地址。当条件为真时插入第一个值

if (inventory == NULL) {
    inventory = tempPart;
    printf("Part added at the first position.\n");
}

inventory 现在保存 tempPart 的地址,但是在分配 tempPart 的值时,您永远不会为它的 nextvalue 分配地址,并且它不存在,因为您只插入了第一个值。对于第二个位置

else{
   while(traversePart->nextPart!=NULL)
      {
        traversePart=traversePart->nextPart;
      }
  if(traversePart->partNumber < tempPart->partNumber){
            //here you can verify conditions
         traversePart->nextPart = tempPart
      }
 }
,

您正在混合 fgetsscanf [和 getchar]。最好只使用 fgets,然后将 strtol 应用于数字 [或 sscanf]。

你的链表代码有点复杂。可以简化。


这是重构后的代码。我已经提取了一些辅助函数来进行提示。

而且,我添加了列表打印。

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

typedef struct part {
    int partNumber;
    char partName[200];
    int partQuantity;
    struct part *nextPart;
} Part;
Part *inventory = NULL;

void insertPart();
int getstr(char *buf,int buflen,const char *prompt);
long getnum_strtol(const char *prompt);

int
main(int argc,char **argv)
{

    insertPart();
    insertPart();
    insertPart();
    insertPart();

    for (Part *cur = inventory;  cur != NULL;  cur = cur->nextPart)
        printf("partNumber=%d partQuantity=%d partName='%s'\n",cur->partNumber,cur->partQuantity,cur->partName);

    return 0;
}

void
insertPart(void)
{
    Part *tempPart;
    Part *cur;
    Part *prev = NULL;
    int counter = 0;

#if 0
    tempPart = (Part *) malloc(sizeof(Part *));
#else
    tempPart = malloc(sizeof(*tempPart));
#endif

    tempPart->partNumber = getnum_strtol("Enter the Part Number");
    getstr(tempPart->partName,sizeof(tempPart->partName),"Enter the Part Name");
    tempPart->partQuantity = getnum_strtol("Enter the Part Quantity");

    tempPart->nextPart = NULL;

    // find the tail/end of the list
    for (cur = inventory;  cur != NULL;  cur = cur->nextPart) {
        ++counter;

        // insert in sorted part order
        if (cur->partNumber > tempPart->partNumber)
            break;

        prev = cur;
    }

    do {
        tempPart->nextPart = cur;

        // insert in the middle or end of list
        if (prev != NULL) {
            prev->nextPart = tempPart;
            break;
        }

        // insert in new list or before first element of existing list
        tempPart->nextPart = inventory;
        inventory = tempPart;
    } while (0);

    printf("\nElement added at position : %d\n",counter);
}

// getstr -- get a string with prompt
// RETURNS: length or (<0 -> error)
int
getstr(char *buf,const char *prompt)
{
    char *cp;
    int ret = 0;

    // NOTE: usage of the error codes in errno.h is arbitrary

    while (ret <= 0) {
        // ensure buffer has enough space
        if (buflen < 2) {
            ret = -ENOMEM;
            break;
        }

        // output prompt
        if (prompt != NULL) {
            printf("%s: ",prompt);
            fflush(stdout);
        }

        // get a line
        cp = fgets(buf,buflen,stdin);

        // EOF
        if (cp == NULL) {
            ret = -ENODATA;
            break;
        }

        // get buffer length
        ret = strlen(buf);

        // empty string
        if (ret <= 0)
            continue;

        // point to last char
        cp = &buf[ret - 1];

        // ensure we got a newline -- if not,fgets had to chop the line (i.e.)
        // the line is too long to fit in the buffer
        if (*cp != '\n') {
            ret = -ENOSPC;
            break;
        }

        // strip the newline -- we are done
        *cp = 0;
        --ret;
    }

    return ret;
}

// getnum_strtol -- get number using strtol
long
getnum_strtol(const char *prompt)
{
    int len;
    int readflg = 1;
    char *cp;
    char buf[100];
    long num = 0;

    while (readflg) {
        len = getstr(buf,sizeof(buf),prompt);

        if (len < 0)
            exit(1);

        num = strtol(buf,&cp,10);

        // ensure we got a least one digit
        if (cp <= buf)
            continue;

        switch (*cp) {
        case ' ':
        case '\t':
        case 0:
            readflg = 0;
            break;
        default:
            printf("getnum_strtol: not a valid number -- buffer '%s',invalid '%s'\n",buf,cp);
            break;
        }
    }

    return num;
}

这是我用来测试的输入文件:

37
Hex Bolt
12
28
Machine Screw
6
23
Brad Nail
1000
27
Lock Nut
300

这是程序输出:

Enter the Part Number: Enter the Part Name: Enter the Part Quantity:
Element added at position : 0
Enter the Part Number: Enter the Part Name: Enter the Part Quantity:
Element added at position : 1
Enter the Part Number: Enter the Part Name: Enter the Part Quantity:
Element added at position : 1
Enter the Part Number: Enter the Part Name: Enter the Part Quantity:
Element added at position : 2
partNumber=23 partQuantity=1000 partName='Brad Nail'
partNumber=27 partQuantity=300 partName='Lock Nut'
partNumber=28 partQuantity=6 partName='Machine Screw'
partNumber=37 partQuantity=12 partName='Hex Bolt'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。