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

头插法:#include<stdio.h>
Linklist CreateFromHead(){
    Linklist L;
    LNode*s;
    char c;
    int flag=1;
    L=(Linklist)malloc(sizeof(LNode));
    //带头节点的单链表 
    L->next=NULL;
    while(flag){
    c=getcahr();
    if(c!="!"){
        s=(Linklist)malloc(szieof(LNode));
        s->data=c;
        s->next=L->next;
        L->next=s;
    }    
    else{
        flag=0;
    }        
    return L;
}

=========================================================================

尾插法:

#include<stdio.h>
Linklist CreateFromTail(){
    Linklist l;
    LNode*s;
    char c;
    int flag=1;
    L=(Linklist)malloc(szieof(LNode));
    L->next=NULL;
    r=L;
    while(flag){
        c=getchar();
        if(c!="!"){
            s=(Linklist)malloc(sizeof(LNode));
            s-data=c;
            r->next=s;
            r=s;
        }
        else{
            flag=0;
            r->next=NULL;
        }
    }
        return L;

}

=========================================================================

求链表长度:

#include<stdio.h>
int ListLength(LinkList L){
    LinkList P;
    P=L;
    j=0;
    while(p->next!=NULL){
        p=p->next;
        j++;
    }
    return j;
}
===============================================

插入元素:

int InsList(LinkList L,int i,char e){
    LinkList pre,s;
    int k;
    pre=L;    k=0;
    //pre指向第i-1个元素的位置 
    while(pre!=NULL&&k<i-1){
        pre=pre->next;
        k++;
    }
    if(k!=i-1){
        printf("插入位置错误");
        return ERROR;
    }
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=pre->next;
    pre->next=s;
    return 1; 
}
===============================================

删除元素:

#include<stdio.h>
int DelList(LinkList L,int i,char*e){
    LinkList pre,r;
    int k;
    pre=L;
    k=0;
    while(pre->next!=NULL&&k<i-1){
        pre=pre->next;
        k++;
    }
    if(k!=i-1){    //此处表示为i<1 
        printf("删除的位置错误!");
        return ERROR;
    }
    r=pre->next;
    pre->next=pre->next->next;
    *e=r->data;
    free(r);
    return 1;
}
===============================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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; } } ``` 以上是链表基本操作实现,你可以根据需要调用这些函数进行链表操作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值