C语言数据结构单链表的实现

本文详细介绍了如何使用C语言创建并操作单链表,包括链表节点的定义、插入、删除等基本操作,帮助理解数据结构中的链表概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


对于单链表这种结构来说,如何理解指针还有插入删除等操作的实质是非常重要的,我今天晚上继续完成昨天的单链表留下的任务,现在对于指针的指示的原理还不是那么的清晰,这个确实比较难!不过既然已经实现了功能,就先这样吧!

#include<iostream>
using namespace std;
typedef struct LNode
{
    int data;//data中存放结点数据域(默认是int型)
    struct LNode *next;//指向后继结点的指针
}LNode;//定义单链表结点类型

void InitList(LNode *L)//初始化单链表
{
    L = (LNode *)malloc(sizeof(LNode));
    L->next = NULL;
}

void PrintList(LNode *L)//打印输出单链表,因为不用改变链表
//所以就不需要引用值类型
{
    LNode *p;
    p = L->next;//结构体指针指向L,这个时候是指向的是头结点
    cout<<"The elements of the list is :"<<endl;     
    while(p->next!=NULL){
        cout<<p->data<<" ";
        p = p->next;
        }//当指针p的next域不是空的时候,
        //也就是说p不是最后一个结点的时候
        //这个时候就一直输出并继续向后走    
    cout<<endl;
}

void CreateList(LNode *&L,int a[],int n)
//要改变的变量用引用值 ,这里用的是尾插法建立链表
{
    LNode *s,*r;
    int i;
    L = (LNode *)malloc(sizeof(LNode));
    //申请头结点空间
    L->next = NULL;
    r = L;//r指向头结点
    for(i=0;i<=n;i++)
    {
        s = (LNode *)malloc(sizeof(LNode));
        //s指向新申请的结点
        s->data = a[i];//用新申请的结点来接收数组a中的元素
        r->next = s;//用r来接纳新结点
        r = r->next;
        //r指向终端节点,以便于接纳下一个到来的结点                
    }
    r->next = NULL;
    //当数组a中所有的元素都已经装入链表C中,C的终端
    //结点的指针域置为NULL,链表创建完成。     
}

void ListInsert(LNode *&L,int n,int x)
{//在数组第n个位置插入元素x
    int i;
    LNode *s;
    s = L;
    for(i=0;i<n-1;i++){
        s = s->next;//第n个位置其实在链表中下标是n-1       
    }
    LNode *p;
    p = (LNode*)malloc(sizeof(LNode));
    //p是新建立的结点,后面用来插入到链表里面的
    p->data = x;//把目标值x放在新建立的p的data域
    p->next = s->next;//然后再修改指针插入p
    s->next = p;
}
void DeleteList(LNode *&L,int n)
{//删除链表中第n个位置的元素
    LNode *s,*p;
    int i,m;
    s = L;
    for(i=0;i<n-1;i++){
        s = s->next;
        p = s->next;                 
    }//建立两个结构体指针,一个指向要删除的结点位置
    //一个指向要删除结点位置的前一个结点的位置     
    m = s->data;
    s->next = p->next;
    free(p);//释放要删除的结点
}

void ListModify(LNode *&L,int n,int x)
{//修改第n个位置的元素值为x
    LNode *s;
    int i;
    s = L;
    for(i=0;i<n;i++){
          s = s->next;                 
    }     
    s->data = x;
}

void FindInList(LNode *L)
{//用户输入一个数字,在链表里面查找有没有这个元素
//有的话就返回这个元素的位置,没有的话就说没有找到
    int leap = 0;
    LNode *s;
    s = L;
    int i=0,n;
    cout<<"Please enter the num you want to find in the list:"<<endl;
    cin>>n;
    while(s->next != NULL){
        if(s->data==n){
            cout<<"the number is in "<<i<<"th position in the list!"<<endl;
            leap = 1;
            break;
            }
        s = s->next;          
        i += 1;
        }
    if(leap==0)
        cout<<"Sorry not found!"<<endl;        
}


int main()
{
    int a[] = {1,2,3,4,5,6,7,8,9,10};
    int n = sizeof(a)/sizeof(a[0]);
    LNode *P;
    InitList(P);
    CreateList(P,a,n);
    PrintList(P);
    cout<<"Now we insert element 18 into the 2rd of thelist:"<<endl;
    ListInsert(P,2,18);
    PrintList(P);
    cout<<"Now we delete the 2rd element of the list:"<<endl;
    DeleteList(P,3);
    PrintList(P);
    cout<<"Now we modify the 5rd element of the list into 26:"<<endl;
    ListModify(P,5,26);
    PrintList(P);
    FindInList(P);
    //PrintList(P);
    system("pause");
    return 0;
}


结果输出如图:


在C语言中,单链表是一种基础的数据结构,它由一系列节点组成,每个节点包含两个部分:数据域和指针域。下面是简单的单向链表的创建、插入、删除和遍历的代码实现: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; // 数据域 struct Node* next; // 指针域,指向下一个节点 } Node; // 创建新节点并初始化 Node* createNode(int value) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode != NULL) { newNode->data = value; newNode->next = NULL; } return newNode; } // 在链表末尾插入节点 void insertNode(Node** head, int value) { Node* newNode = createNode(value); if (*head == NULL) { *head = newNode; } else { Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } // 删除指定值的节点 void deleteNode(Node** head, int value) { if (*head == NULL) { return; } if ((*head)->data == value) { Node* temp = *head; *head = (*head)->next; free(temp); return; } Node* prev = *head; Node* curr = (*head)->next; while (curr != NULL && curr->data != value) { prev = curr; curr = curr->next; } if (curr != NULL) { prev->next = curr->next; free(curr); } } // 遍历链表并打印元素 void printList(Node* head) { Node* temp = head; while (temp != NULL) { printf("%d -> ", temp->data); temp = temp->next; } printf("NULL\n"); } int main() { Node* head = NULL; // 插入一些节点 insertNode(&head, 1); insertNode(&head, 2); insertNode(&head, 3); // 打印链表 printList(head); // 删除节点 deleteNode(&head, 2); // 再次打印链表 printList(head); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值