c - 带字符的链表(字符串问题

标签 c linked-list

所以我的代码与我正在使用的结构有问题。我希望我的结构能够添加、检索或排序,但我在结构方面遇到了很多问题。如果我只使用数字但我需要用户 3 个字符串,它就可以工作。一个是名字、姓氏和电话号码,但我想不出来。

这是我现在拥有的代码:

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

struct node
{
    int data;
    char first[15];
    char last[15];
    char phone[12];
    struct node *next;
}*head;



void append(int num, char f[15], char l[15],char p[12])
{
    struct node *temp, *right;
    temp = (struct node *)malloc(sizeof(struct node));
    temp->data = num;
    strcpy(temp->first, f);
    strcpy(temp->last, l);
    strcpy(temp->phone, p);
    right = (struct node *)head;
    while (right->next != NULL)
        right = right->next;
    right->next = temp;
    right = temp;
    right->next = NULL;
}



void add(int num, char f[15], char l[15],char p[12])
{
    struct node *temp;
    temp = (struct node *)malloc(sizeof(struct node));
    temp->data = num;
    strcpy(temp->first, f);
    strcpy(temp->last, l);
    strcpy(temp->phone, p);
    if (head == NULL)
    {
        head = temp;
        head->next = NULL;
    }
    else
    {
        temp->next = head;
        head = temp;
    }
}
void addafter(int num, char f[15], char l[15],char p[12],int loc)
{
    int i;
    struct node *temp, *left, *right;
    right = head;
    for (i = 1; i<loc; i++)
    {
        left = right;
        right = right->next;
    }
    temp = (struct node *)malloc(sizeof(struct node));
    temp->data = num;
    strcpy(temp->first, f);
    strcpy(temp->last, l);
    strcpy(temp->phone, p);
    left->next = temp;
    left = temp;
    left->next = right;
    return;
}



void insert(int num, char f[15], char l[15],char p[12])
{
    int c = 0;
    struct node *temp;
    temp = head;
    if (temp == NULL)
    {
        add(num,f,l,p);
    }
    else
    {
        while (temp != NULL)
        {
            if (temp->data<num)
                c++;
            temp = temp->next;
        }
        if (c == 0)
            add(num,f,l,p);
        else if (c<count())
            addafter(num,f,l,p, ++c);
        else
            append(num,f,l,p);
    }
}



int delete(int num)
{
    struct node *temp, *prev;
    temp = head;
    while (temp != NULL)
    {
        if (temp->data == num)
        {
            if (temp == head)
            {
                head = temp->next;
                free(temp);
                return 1;
            }
            else
            {
                prev->next = temp->next;
                free(temp);
                return 1;
            }
        }
        else
        {
            prev = temp;
            temp = temp->next;
        }
    }
    return 0;
}


void  display(struct node *r)
{
    r = head;
    if (r == NULL)
    {
        return;
    }
    while (r != NULL)
    {
        printf("%d ", r->data);
        r = r->next;
    }
    printf("\n");
}


int count()
{
    struct node *n;
    int c = 0;
    n = head;
    while (n != NULL)
    {
        n = n->next;
        c++;
    }
    return c;
}


int  main()
{
    int i, num;
    char fname[15], lname[15], phone[12];
    struct node *n;
    head = NULL;
    while (1)
    {
        printf("\nList Operations\n");
        printf("===============\n");
        printf("1.Insert\n");
        printf("2.Display\n");
        printf("3.Retrieve\n");
        printf("4.Delete\n");
        printf("5.Exit\n");
        printf("Enter your choice : ");
        if (scanf("%d", &i) <= 0){
            printf("Enter only an Integer\n");
            exit(0);
        }
        else {
            switch (i)
            {
            case 1:     
                printf("Enter the id, first, last and phone (Separte with space) : ");
                scanf("%d %s %s %s", &num,fname,lname,phone);
                insert(num,fname,lname,phone);
                break;
            case 2:     
                if (head == NULL){
                    printf("List is Empty\n");
                }else{
                    printf("Element(s) in the list are : ");
                }
                display(n);
                break;
            case 3:     
                //To be made
                //scanf("Retrieve this : %d\n", count());
                break;
            case 4:     
                if (head == NULL){
                    printf("List is Empty\n");
                }else{
                    printf("Enter the number to delete : ");
                    scanf("%d", &num);
                    if (delete(num))
                        printf("%d deleted successfully\n", num);
                    else
                        printf("%d not found in the list\n", num);
                }
                break;
            case 5:     
                return 0;
            default:    
                printf("Invalid option\n");
            }
        }
    }
    return 0;
}

感谢任何可以向我解释问题或解决问题的人。

最佳答案

随处可见:

temp->data = num;

添加行

strcpy(temp->first, f);
strcpy(temp->last, l);
strcpy(temp->phone, p);

关于c - 带字符的链表(字符串问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29454455/

相关文章:

c - 使用 MPI 或 openMP 在 c 中进行循环并行化的最佳方法

c - 使用 perf 或其他方式获取 C 程序的运行时间(或其他统计信息)

c - 缩放互补误差函数的精确计算,erfcx()

c - 无法打印链表

c++ - 清除单向链表

C 指针和链表

创建链接列表会出现段错误(核心转储)错误

c - 将项目添加到空链表 C

c - 为什么使用 struct 可以工作而 typedef struct 不行?

c - 在多线程程序中为 system() 向下传递信息