单链表的基本操作(C语言实现)

本文详细介绍了单链表的基本操作,包括初始化、头插法和尾插法建立单链表、在指定位置插入元素以及删除特定值的元素等。通过具体的C语言实现,帮助读者理解和掌握单链表的操作流程。
////////////////////////////////////////////  
//单链表的初始化,建立,插入,查找,删除。//  
////////////////////////////////////////////   
#include <stdio.h>  
#include <stdlib.h>  
typedef int ElemType;  
////////////////////////////////////////////   
//定义结点类型   
typedef struct Node  
{  
    ElemType data;              //单链表中的数据域   
    struct Node *next;          //单链表的指针域   
}Node,*LinkedList;  
////////////////////////////////////////////   
//单链表的初始化  
LinkedList LinkedListInit()  
{  
    Node *L;  
    L = (Node *)malloc(sizeof(Node));   //申请结点空间   
    if(L == NULL)                       //判断是否有足够的内存空间   
        printf("申请内存空间失败/n");  
    L->next = NULL;                  //将next设置为NULL,初始长度为0的单链表   
}  
////////////////////////////////////////////   
//单链表的建立1,头插法建立单链表  
LinkedList LinkedListCreatH()  
{  
    Node *L;  
    L = (Node *)malloc(sizeof(Node));   //申请头结点空间  
    L->next = NULL;                      //初始化一个空链表  
      
    ElemType x;                         //x为链表数据域中的数据  
    while(scanf("%d",&x) != EOF)  
    {  
        Node *p;  
        p = (Node *)malloc(sizeof(Node));   //申请新的结点   
        p->data = x;                     //结点数据域赋值   
        p->next = L->next;                    //将结点插入到表头L-->|2|-->|1|-->NULL   
        L->next = p;   
    }  
    return L;   
}   
////////////////////////////////////////////   
//单链表的建立2,尾插法建立单链表  
LinkedList LinkedListCreatT()  
{  
    Node *L;  
    L = (Node *)malloc(sizeof(Node));   //申请头结点空间  
    L->next = NULL;                  //初始化一个空链表  
    Node *r;  
    r = L;                          //r始终指向终端结点,开始时指向头结点   
    ElemType x;                         //x为链表数据域中的数据  
    while(scanf("%d",&x) != EOF)  
    {  
        Node *p;  
        p = (Node *)malloc(sizeof(Node));   //申请新的结点   
        p->data = x;                     //结点数据域赋值   
        r->next = p;                 //将结点插入到表头L-->|1|-->|2|-->NULL   
        r = p;   
    }  
    r->next = NULL;   
      
    return L;     
}  
////////////////////////////////////////////   
//单链表的插入,在链表的第i个位置插入x的元素  
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x)  
{  
    Node *pre;                      //pre为前驱结点   
    pre = L;  
    int tempi = 0;  
    for (tempi = 1; tempi < i; tempi++)  
        pre = pre->next;                 //查找第i个位置的前驱结点   
    Node *p;                                //插入的结点为p  
    p = (Node *)malloc(sizeof(Node));  
    p->data = x;   
    p->next = pre->next;  
    pre->next = p;  
      
    return L;                             
}   
////////////////////////////////////////////   
//单链表的删除,在链表中删除值为x的元素  
LinkedList LinkedListDelete(LinkedList L,ElemType x)  
{  
    Node *p,*pre;                   //pre为前驱结点,p为查找的结点。   
    p = L->next;  
    while(p->data != x)              //查找值为x的元素   
    {     
        pre = p;   
        p = p->next;  
    }  
    pre->next = p->next;          //删除操作,将其前驱next指向其后继。   
    free(p);  
    return L;  
}   
/////////////////////////////////////////////  
int main()  
{  
    LinkedList list,start;  
/*  printf("请输入单链表的数据:");  
    list = LinkedListCreatH(); 
    for(start = list->next; start != NULL; start = start->next) 
        printf("%d ",start->data); 
    printf("/n"); 
*/  printf("请输入单链表的数据:");   
    list = LinkedListCreatT();  
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
    int i;  
    ElemType x;  
    printf("请输入插入数据的位置:");  
    scanf("%d",&i);  
    printf("请输入插入数据的值:");  
    scanf("%d",&x);  
    LinkedListInsert(list,i,x);  
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
    printf("请输入要删除的元素的值:");  
    scanf("%d",&x);  
    LinkedListDelete(list,x);   
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
      
    return 0;  
}   
 



单链表是一种常见的数据结构,用于存储一系列的元素。在C语言中,可以通过定义一个结构体来表示单链表的节点,每个节点包含一个数据域和一个指针域,指向下一个节点。 首先,我们需要定义单链表的节点结构体: ```c struct ListNode { int data; // 数据域 struct ListNode* next; // 指针域,指向下一个节点 }; ``` 接下来,我们可以实现一些基本操作,比如创建单链表、插入节点、删除节点和遍历单链表等。 创建单链表的函数如下所示,可以根据给定的数组创建一个单链表: ```c struct ListNode* createLinkedList(int arr[], int size) { struct ListNode* head = NULL; // 头节点指针 struct ListNode* tail = NULL; // 尾节点指针 for (int i = 0; i < size; i++) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->data = arr[i]; newNode->next = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } } return head; } ``` 插入节点的函数如下所示,可以在指定位置插入一个新节点: ```c void insertNode(struct ListNode** head, int data, int position) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->data = data; newNode->next = NULL; // 插入到链表头部 if (position == 0) { newNode->next = *head; *head = newNode; return; } struct ListNode* curr = *head; struct ListNode* prev = NULL; int count = 0; // 找到插入位置的前一个节点 while (curr != NULL && count < position) { prev = curr; curr = curr->next; count++; } // 插入到链表中间或尾部 if (curr != NULL) { newNode->next = curr; } prev->next = newNode; } ``` 删除节点的函数如下所示,可以删除指定位置的节点: ```c void deleteNode(struct ListNode** head, int position) { if (*head == NULL) { return; } struct ListNode* curr = *head; struct ListNode* prev = NULL; int count = 0; // 找到要删除的节点 while (curr != NULL && count < position) { prev = curr; curr = curr->next; count++; } // 删除头节点 if (prev == NULL) { *head = curr->next; } else { prev->next = curr->next; } free(curr); } ``` 遍历单链表的函数如下所示,可以将单链表中的元素依次输出: ```c void traverseLinkedList(struct ListNode* head) { struct ListNode* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } } ``` 以上是单链表基本操作实现,你可以根据需要调用这些函数进行单链表的操作。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值