数据结构C语言版单链表操作

单链表的数据域为字符串,插入时不允许重复的字符串插入表中;删除操作要根据输入的字符串,先查找该结点再删除。
1.定义单链表head和字符串str。
2.初始化单链表。
3.编写串比较函数。
4.调用串插入,串删除模块实现串操作。
运行程序,按提示输入数据:
创建单链表,输入字符串(空串结束)
string struct char int float string double
请输入要插入的字符串typedef
插入成功
typedef double float int char struct string
请输入要删除的字符串string
删除成功
typedef double float int char struct
(用户也可以输入存在的字符串进行插入测试,输入不存在的字符串进行删除测试,在此不在给出测试数据)
实现单链表的复杂操作,如单链表逆置,循环单链表,单链表的合并

参考GPT和自己的思路:好的,以下是针对你提出的问题的回答:

1.定义单链表head和字符串str。

单链表的定义可以使用结构体来实现,其中定义一个指向单链表头结点的指针head,以及一个表示数据域的字符串变量str。

例如:

typedef struct Node{ 
    char string[20];    //字符串数据域 
    struct Node *next;  //指向下一个结点的指针 
}Node;

Node *head;             //指向单链表头结点的指针 
char str[20];           //字符串变量 

2.初始化单链表。

单链表初始化时,将head指针指向null,表示单链表为空。

例如:

head = NULL;

3.编写串比较函数。

串比较函数可以使用strcmp()函数来实现。

例如:

int cmp(char str1[], char str2[]) {
    return strcmp(str1, str2);
}

4.调用串插入和串删除模块实现串操作。

串插入操作,需要判断插入的字符串是否重复,如果重复则不进行插入操作。同时,需要对单链表进行遍历,查找插入位置。

例如:

void insert(char str[]) {
    Node *p, *q, *new_node;
    new_node = (Node *)malloc(sizeof(Node));
    strcpy(new_node->string, str);
    new_node->next = NULL;
    p = q = head;
    while (p != NULL && cmp(p->string, str) < 0) {
        q = p;
        p = p->next;
    }
    if (p != NULL && cmp(p->string, str) == 0) {
        printf("该字符串已存在!\n");
        return;
    }
    if (p == head) {
        head = new_node;
    } else {
        q->next = new_node;
    }
    new_node->next = p;
    printf("插入成功!\n");
}

串删除操作,需要查找到要删除的字符串所在的结点,对该结点进行删除操作。同时,需要对单链表进行遍历和指针操作。

例如:

void delete(char str[]) {
    Node *p, *q;
    p = q = head;
    while (p != NULL && cmp(p->string, str) != 0) {
        q = p;
        p = p->next;
    }
    if (p == NULL) {
        printf("该字符串不存在!\n");
        return;
    }
    if (p == head) {
        head = p->next;
    } else {
        q->next = p->next;
    }
    free(p);
    printf("删除成功!\n");
}

单链表逆置操作,需要对单链表进行遍历和指针操作,将每个结点的指针指向上一个结点,最后将head指针指向逆置后的单链表的头结点。

例如:

void reverse() {
    Node *p, *q, *r;
    if (head == NULL || head->next == NULL) {
        return;
    }
    p = head;
    q = NULL;
    while (p != NULL) {
        r = p->next;
        p->next = q;
        q = p;
        p = r;
    }
    head = q;
    printf("单链表逆置成功!\n");
}

循环单链表操作,需要在单链表的尾结点指向头结点,将其变成循环单链表。同时,需要注意单链表为空和单链表只有一个结点的情况。

例如:

void circle() {
    Node *p;
    if (head == NULL) {
        return;
    }
    p = head;
    while (p->next != NULL) {
        p = p->next;
    }
    p->next = head;
    printf("单链表循环成功!\n");
}

单链表的合并操作,需要将两个单链表进行遍历和指针操作,将其中一个单链表的尾结点指向另一个单链表的头结点。

例如:

void merge(Node *head1, Node *head2) {
    Node *p, *q;
    if (head1 == NULL) {
        head = head2;
        return;
    }
    if (head2 == NULL) {
        head = head1;
        return;
    }
    p = head1;
    while (p->next != NULL) {
        p = p->next;
    }
    p->next = head2;
    head = head1;
    printf("单链表合并成功!\n");
}

以上就是我的回答,希望能够对你有所帮助!