单链表的基本操作(数据结构)

请定义一个链表,可以对链表进行“在某个元素之前插入一些元素”、“删除某个位置的元素”、“查找某元素”、“获取某个位置的元素”、“遍历输出所有元素”、“求链表的长度”等操作。键盘输入一些命令,可以执行上述操作。本题中,链表元素为整数,链表的第一个元素位置为1,链表的最大长度为20。

各个命令以及相关数据的输入格式如下:

在某个位置之前插入操作的命令:I,接下来的一行是插入的元素个数n,下面是n行数据,每行数据有两个值,分别代表插入位置与插入的元素值。
查找某个元素:S x,x是要查找的元素值;
获取某个位置的元素:G i,i是需要获取的元素位置;
删除某个位置的元素:D i,i是被删除的元素位置;
求链表的长度:L;
遍历输出所有元素:V;
当输入的命令为E时,程序结束。
当输入的命令为 S 时,输出要查找元素的位置,如果没找到,输出 None;
当输入的命令为 G 时,输出获取的元素值,如果输入的元素位置不正确,输出“位置不正确”;
当输入的命令是 D 时,输出被删除的那个元素值,如果表空,输出“下溢”,如果输入的位置不正确,输出“位置不正确”;
当输入命令是 I 时,如果输入的位置不正确,输出“位置不正确”;
当输入的命令是 L 时,输出链表的长度。
注意,所有的元素均占一行。
输入样例:

I
2
1 1
2 2
S 2
D 1
I
2
1 3
2 4
G 2
L
V
E
输出样例:

2
1
4
3
3
4
2
补全如下代码

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

// 链表节点结构体
struct Node {
    int data;
    struct Node* next;
};

// 初始化链表
void initList(struct Node** head) {
    *head = NULL;
}

// 在某个位置之前插入元素
void insertBefore(struct Node** head, int position, int value) {
//单链表插入操作
/***********Begin***********/


/************End************/  
    

}

// 删除某个位置的元素
void deleteNode(struct Node** head, int position) {
//单链表按位置删除操作    
/***********Begin***********/


/************End************/
}

// 查找某个元素
void searchValue(struct Node* head, int value) {
//单链表按值查找操作
/***********Begin***********/


/************End************/  
}

// 获取某个位置的元素
void getValue(struct Node* head, int position) {
    if (position < 1 || position > 20) {
        printf("位置不正确\n");
        return;
    }

    struct Node* current = head;
    int count = 1;
    while (current != NULL && count < position) {
        current = current->next;
        count++;
    }

    if (current == NULL) {
        printf("位置不正确\n");
        return;
    }

    printf("%d\n", current->data);
}

// 遍历输出所有元素
void traverseList(struct Node* head) {
    struct Node* current = head;
    while (current != NULL) {
        printf("%d\n", current->data);
        current = current->next;
    }
}

// 求链表长度
int getLength(struct Node* head) {
//求单链表中元素个数
/***********Begin***********/


/************End************/
}

int main() {
    struct Node* head;
    initList(&head);
    //按照题目要求完成
/***********Begin***********/


/************End************/
    return 0;
}

代码如下:

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

// 链表节点结构体
struct Node {
    int data;
    struct Node* next;
};

// 初始化链表
void initList(struct Node** head) {
    *head = NULL;
}

// 在某个位置之前插入元素
void insertBefore(struct Node** head, int position, int value) {
    //单链表插入操作
    /***********Begin***********/
    struct Node *pre=NULL;
    int cnt;
    struct Node* q =NULL;

    if(position <1)
    {
        printf("位置不正确\n");
        return;
    }
    
    if(position == 1)
    {
        q = (struct Node*)malloc(sizeof(struct Node));
        q->data = value;
        q->next = NULL;
        if(*head == NULL)
            *head = q;
        else
        {
            q->next = (*head);
            *head = q;
        }
    }else
    {
        pre = *head;
        cnt = 2;
        while(cnt < position && pre)
        {
            cnt++;
            pre = pre->next;
        }
        if(pre)
        {
            q = (struct Node*)malloc(sizeof(struct Node));
            q->data = value;
            q->next = pre->next;
            pre->next = q;
        }else
            printf("位置不正确\n");
    }
    /************End************/  


}

// 删除某个位置的元素
void deleteNode(struct Node** head, int position) {
    //单链表按位置删除操作    
    /***********Begin***********/
    struct Node* pre=NULL,*t=NULL;
    int cnt = 1;
    if(*head==NULL)
    {
        printf("下溢\n");
        return;
    }
    if(position<1)
        printf("位置不正确\n");


    if(position == 1)
    {
        printf("%d\n",(*head)->data);
        (*head) = (*head)->next;
    }else
    {
        pre = *head;
        cnt = 2;
        while(cnt < position && pre->next)
        {
            cnt++;
            pre = pre->next;
        }
        if(pre->next)
        {
            t = pre->next;
            printf("%d\n",t->data);
            pre->next = t->next;
            free(t);
        }else
            printf("位置不正确\n");
    }

    /************End************/
}

// 查找某个元素
void searchValue(struct Node* head, int value) {
    //单链表按值查找操作
    /***********Begin***********/
    struct Node* p = head;
    int pos = 1;
    while(p && p->data != value)
    {
        p =p->next;
        pos++;
    }
    if(p == NULL)
        printf("None\n");
    else
        printf("%d\n",pos);


    /************End************/  
}

// 获取某个位置的元素
void getValue(struct Node* head, int position) {
    if (position < 1 || position > 20) {
        printf("位置不正确\n");
        return;
    }

    struct Node* current = head;
    int count = 1;
    while (current != NULL && count < position) {
        current = current->next;
        count++;
    }

    if (current == NULL) {
        printf("位置不正确\n");
        return;
    }

    printf("%d\n", current->data);
}

// 遍历输出所有元素
void traverseList(struct Node* head) {
    struct Node* current = head;
    while (current != NULL) {
        printf("%d\n", current->data);
        current = current->next;
    }
}

// 求链表长度
int getLength(struct Node* head) {
    //求单链表中元素个数
    /***********Begin***********/
    struct Node* p = head;
    int len = 0;
    while(p)
    {
        len++;
        p = p->next;
    }
    return len;
    /************End************/
}

int main() {
    struct Node* head;
    initList(&head);
    //按照题目要求完成
    /***********Begin***********/
    char op;
    int n,pos,val,x;
    for(;;)
    {
        scanf(" %c", &op);
        if (op == 'I') {
            scanf("%d", &n);
            for (int j = 0; j < n; j++) {
                scanf("%d %d", &pos, &val);
                insertBefore(&head, pos, val);
            }
        } else if (op == 'S') {
            scanf("%d", &x);
            searchValue(head, x);
        } else if (op == 'G') {
            scanf("%d", &pos);
            getValue(head, pos);
        } else if (op == 'D') {
            scanf("%d", &pos);
            deleteNode(&head, pos);
        } else if (op == 'L') {
            printf("%d\n",getLength(head));
        } else if (op == 'V') {
            traverseList(head);
        } else {
            break;
        }

    }

    /************End************/
    return 0;
}


【以下回答由 GPT 生成】

定义一个链表数据结构,包含一个头节点和链表长度属性

class ListNode:
    def __init__(self, val=None):
        self.val = val
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = ListNode()
        self.length = 0

实现插入元素的函数,根据给定的位置在链表中插入元素

    def insert(self, pos, val):
        # 检查插入位置是否正确
        if pos < 1 or pos > self.length+1:
            return "位置不正确"

        # 创建新节点
        newNode = ListNode(val)

        # 找到插入位置的前一个节点
        prev = self.head
        for _ in range(pos-1):
            prev = prev.next

        # 插入新节点
        newNode.next = prev.next
        prev.next = newNode

        # 更新链表长度
        self.length += 1

实现删除元素的函数,根据给定的位置删除链表中的元素

    def delete(self, pos):
        # 检查删除位置是否正确
        if pos < 1 or pos > self.length:
            return "位置不正确"

        # 找到删除位置的前一个节点
        prev = self.head
        for _ in range(pos-1):
            prev = prev.next

        # 获取要删除的节点
        deletedNode = prev.next

        # 删除节点
        prev.next = deletedNode.next

        # 更新链表长度
        self.length -= 1

        # 返回被删除的元素值
        return deletedNode.val

实现查找元素的函数,从链表中查找给定元素的位置

    def search(self, val):
        # 遍历链表查找元素
        cur = self.head.next
        pos = 1
        while cur:
            if cur.val == val:
                return pos
            cur = cur.next
            pos += 1

        # 如果未找到元素,则返回None
        return "None"

实现获取指定位置元素的函数,返回链表中给定位置的元素值

    def get(self, pos):
        # 检查位置是否正确
        if pos < 1 or pos > self.length:
            return "位置不正确"

        # 遍历链表找到指定位置的元素
        cur = self.head.next
        for _ in range(pos-1):
            cur = cur.next

        # 返回元素值
        return cur.val

实现遍历输出所有元素的函数,将链表中的所有元素打印出来

    def traverse(self):
        # 遍历链表输出元素
        cur = self.head.next
        while cur:
            print(cur.val)
            cur = cur.next

实现获取链表长度的函数

    def get_length(self):
        return self.length

读取键盘输入的命令并执行相应的操作

linked_list = LinkedList()
command = input()

while command != "E":
    if command == "I":
        n = int(input())
        for _ in range(n):
            pos, val = map(int, input().split())
            linked_list.insert(pos, val)
    elif command[0] == "S":
        val = int(command[2:])
        result = linked_list.search(val)
        print(result)
    elif command[0] == "D":
        pos = int(command[2:])
        result = linked_list.delete(pos)
        print(result)
    elif command[0] == "G":
        pos = int(command[2:])
        result = linked_list.get(pos)
        print(result)
    elif command == "L":
        result = linked_list.get_length()
        print(result)
    elif command == "V":
        linked_list.traverse()

    command = input()

以上就是解决问题的完整过程。



【相关推荐】


  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/731553
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632