c++/c详细链表操作(头插尾插创建,插入,删除,查找,遍历,清空)

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<windows.h>
using namespace std;
typedef struct Node
{
    int number;//数据域
    struct Node*next;//指针域
} Node,*Linklist;
//链表的初始化
void linklistIntit(Linklist &L)
{
    L=(Linklist)malloc(sizeof(Node));
    L->next=NULL;
}
//头插法创建链表
void linklistheadCreat1(Linklist &L,int n)
{
    Linklist p;
    for(int i=0; i<n; i++)
    {
        p=(Linklist)malloc(sizeof(Node));//开辟空间
        cout<<"请你输入数据\n";
        cin>>p->number;
        p->next=L->next;
        L->next=p;
    }
}
//尾插法创建链表
void linklistheadCreat2(Linklist &L,int n)
{
    Linklist rear=L;//定义rear由下下面操作(rear=p;)让rear始终指向尾部节点

    for(int i=0; i<n; i++)
    {
        Linklist p=(Linklist)malloc(sizeof(Node));
        cout<<"请输入数据\n";
        cin>>p->number;
        rear->next=p;
        rear=p;
        rear->next=NULL;//必不可少指向空
    }
}
//遍历链表
void linklistTreavle(Linklist &L)
{
    Linklist p;
    p=L->next;
    while(p)
    {
        printf("%d ",p->number);
        p=p->next;
    }
}
//查找指定元素
bool linklistLocate(Linklist &L,int data)
{
    Linklist p;
    p=L->next;
    while(p)
    {
        if(p->number==data)
        {
            cout<<"已找到"<<data<<'\n';
            return true;
        }
        p=p->next;
    }
    cout<<"抱歉没有您要的值!"<<'\n';
    return false;
}
//指定位置插入指定元素
void linklistInsert(Linklist &L,int n,int data)
{
    Linklist p;
    p=L->next;
    for(int i=0; i<n-1; i++)
    {
        p=p->next;
    }
    Linklist q=(Linklist)malloc(sizeof(Node));
    q->number=data;
    q->next=p->next;//顺序不能颠倒
    p->next=q;
}
//删除指定元素
bool linklistDelete(Linklist &L,int data)
{
    Linklist p,q;//两个指针使p始终在q的前一个,这样方便删除q之后做好接下来的连接工作
    p=L;
    q=L->next;
    while(q)
    {
        if(q->number==data)
        {
            p->next=q->next;
            free(q);
            cout<<"找到并且删除!\n";
            return true;
        }
        p=q;//使p始终在q的前面
        q=q->next;
    }
    cout<<"不存在您找的值!\n";
    return false;
}
//清空链表
void linklistClear(Linklist &L)
{
    Linklist p=L;
    while(L)
    {
        L=L->next;//先移动L
        free(p);//再释放p
        p=L;//再移动p
    }
    cout<<"链表清空完毕!\n";
}
//菜单
void linklistMenu()
{
    cout<<"链表已经完成初始化"<<'\n';
    cout<<"1.头插法建立链表"<<"2.尾插法建立链表"<<'\n';
    cout<<"3.链表中插入数据"<<"4.删除指定数据"<<'\n';
    cout<<"5.查找指定元素"<<"6.清空链表"<<'\n';
    cout<<"7.遍历链表"<<'\n';

}
int main()
{
    int data,n,i;
    Linklist L;
    linklistIntit(L);
    while(1)
    {
        system("cls");//清屏

        linklistMenu();
        cin>>i;
        switch(i)
        {
        case 1:
            cout<<"请输入数量!"<<'\n';
            cin>>n;
           linklistheadCreat1(L,n);
            break;
        case 2:
            cout<<"请输入数量!"<<'\n';
            cin>>n;
            linklistheadCreat2(L,n);
            break;
        case 3:
            cout<<"请输入位置和新值!"<<'\n';
            cin>>n>>data;
           linklistInsert(L,n,data);
            break;
        case 4:
            cout<<"请输入要删除的值!"<<'\n';
            cin>>data;
           linklistDelete(L,data);
            break;
        case 5:
            cout<<"请输入要查找的值!"<<'\n';
            cin>>data;
            linklistLocate(L,data);
            break;
        case 6:
            linklistClear(L);
            break;
        case 7:
            linklistTreavle(L);
        }

        system("pause");//按任意键继续

    }
    return 0;
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于单链表的C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> //定义链表结构体 struct ListNode { int val; //存储节点的值 struct ListNode *next; //指向下一个节点的指针 }; //创建一个新节点 struct ListNode *createNode(int val) { struct ListNode *newNode = (struct ListNode *)malloc(sizeof(struct ListNode)); newNode->val = val; newNode->next = NULL; return newNode; } //在链表末尾插入一个节点 void insertNodeAtEnd(struct ListNode **head, int val) { struct ListNode *newNode = createNode(val); if (*head == NULL) { *head = newNode; return; } struct ListNode *tail = *head; while (tail->next != NULL) { tail = tail->next; } tail->next = newNode; } //在链表插入一个节点 void insertNodeAtHead(struct ListNode **head, int val) { struct ListNode *newNode = createNode(val); newNode->next = *head; *head = newNode; } //删除链表中第一个值为val的节点 void deleteNode(struct ListNode **head, int val) { if (*head == NULL) { return; } if ((*head)->val == val) { *head = (*head)->next; return; } struct ListNode *prev = *head; struct ListNode *curr = (*head)->next; while (curr != NULL && curr->val != val) { prev = curr; curr = curr->next; } if (curr != NULL) { prev->next = curr->next; free(curr); } } //查找链表中是否存在值为val的节点 int searchNode(struct ListNode *head, int val) { struct ListNode *curr = head; while (curr != NULL) { if (curr->val == val) { return 1; } curr = curr->next; } return 0; } //遍链表并输出所有节点的值 void printList(struct ListNode *head) { struct ListNode *curr = head; while (curr != NULL) { printf("%d ", curr->val); curr = curr->next; } printf("\n"); } int main() { struct ListNode *head = NULL; insertNodeAtEnd(&head, 1); insertNodeAtEnd(&head, 2); insertNodeAtEnd(&head, 3); insertNodeAtHead(&head, 0); printList(head); // 0 1 2 3 deleteNode(&head, 2); printList(head); // 0 1 3 printf("%d\n", searchNode(head, 1)); // 1 printf("%d\n", searchNode(head, 2)); // 0 return 0; } ``` 这里我们定义了一个结构体`ListNode`来表示链表中的节点,每个节点包含一个`val`成员来存储节点的值,还有一个`next`指针成员来指向下一个节点。我们使用`createNode`函数来创建一个新节点,并使用`insertNodeAtEnd`和`insertNodeAtHead`函数来在链表末尾和插入新节点。`deleteNode`函数可以删除链表中第一个值为`val`的节点,而`searchNode`函数用于查找链表中是否存在值为`val`的节点。最后,我们使用`printList`函数来遍链表并输出所有节点的值。在`main`函数中,我们演示了如何使用这些函数来操作链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值