电话簿链接列表

时间:2017-06-10 17:35:39

标签: c linked-list

当我将联系人添加到列表并打印出来时,我遇到了链表的问题,它打印出第一个列表两次而不是第一个和第二个列表。请让我知道我做错了什么。 感谢。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define true 1
#define false 0

typedef int boolean;
typedef int Position;
typedef int Count;

typedef struct node_def {
    int area_code;
    char name[30];
    char phone_number[8];
    struct mode_def *next;
} Node;

typedef struct {
    Position currentPos;
    Count nodeCount;
    Node *head;
    Node *current;
    Node  *tail;
} ListADT;

void initList(ListADT*);
boolean checkEmpty(ListADT*); 
void addList(ListADT*, int, char*, char*); 
void printList(ListADT*);

int main(void) {
    ListADT phoneList;
    initList(&phoneList);
    Node *firstNode;
    addList(&phoneList, 416, "Sam", "1234567");
    addList(&phoneList, 416, "Bob", "7654321");
    firstNode-> next;
    printList(&phoneList);
    printList(&phoneList);
    return 0;
}

void initList(ListADT* list){
    list->currentPos = -1;
    list->nodeCount = 0;
    list->head = NULL;
    list->tail = NULL;
}

boolean checkEmpty(ListADT* list){
    return list->nodeCount == 0 ? true : false;
} 

void addList(ListADT* list, int areaCode, char* name, char* phoneNum){
    Node* newNode = malloc(sizeof(Node));
    assert(newNode);
    newNode->area_code = areaCode;
    strcpy(newNode->name, name);
    strcpy(newNode->phone_number, phoneNum);
    newNode->next = NULL;
    if(list->nodeCount == 0) {
        list->head = newNode;
        list->tail = newNode;
        list->currentPos = 0;
        list->nodeCount = 1;
    }
    else {
        list->tail = newNode;
        list->current = list->tail;
        list->nodeCount++;
        list->currentPos = list->nodeCount -1;
    }
} 

void printList(ListADT* list){
    if(!checkEmpty(list)){
        Node* newNode = list->head;
        printf("The name is %s\n",newNode->name);
        printf("The phone number is %i-%s\n",newNode->area_code,newNode->phone_number);
    }else
    printf("The list is empty.\n");
}

1 个答案:

答案 0 :(得分:1)

意味着没有坏处,但根据您对当前代码的问题,我想在编写自己的抽象数据类型之前,您必须获得更多的编程经验,特别是在C ++编程方面。 有很多事情只做了一半,实际上你问“为什么我的功能,除了打印完全第一个元素之外别无其他,如果我将这个函数调用两次,则打印相同的元素两次。”。< / p>

无论如何,一些提示:

  • struct mode_def *next中的错字,应为struct node_def *next
  • 确保next实际设置在某处,例如else { list->tail->next = newNode;否则你将无法获得链接列表但未链接的节点
  • 打印时,通过next遍历节点,即while(node!=NULL) { ...; node=node->next; }
  • firstNode-> next;什么都不做