单链表基本操作代码

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

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

typedef struct List
{
    struct List *next;
    int data;
}List;

List *creatList(int *arr, int len)
{
    List *head, *p;
    List *s;
    int i;
    
    head = (List *)malloc(sizeof(List));
    head->next = NULL;
    p = head;
    
    for(i = 0; i < len; i++)
    {
        s = (List *)malloc(sizeof(List));
        s->data = arr[i];
        
        s->next= p->next;
        p->next = s;
        p = s;
    }
    p->next = NULL;
    head = head->next;
    
    return head;
}

//insert node before value.
List *insertNodeBefore(List *list, int value)
{
    List *p, *q;
    List *node;
    
    p = list;
    while(NULL != p && p->data != value)
    {
        q = p;
        p = p->next;
    }
    
    if(NULL == p)
    {
        printf("list has nod %d!\n", value);
        return list;
    }
    node = (List *)malloc(sizeof(List));
    node->data = 0;
    
    node->next = p;
    q->next = node;
            
    return list;
}

List *deleteNode(List *list, int value)
{
    List *p, *q;
    
    p = list;
    while(NULL != p && p->data != value)
    {
        q = p;
        p = p->next;    
    }
    if(NULL == p)
    {
        printf("list has not %d\n", value);
        return list;
    }
    q->next= p->next;
    free(p);
    
    return list;
}

List *revList(List *list)
{
    List *p1 = list;
    List *p2 = list;
    List *p3 = list;
    
    if(NULL == list || NULL == list->next)
    {
        printf("list is Null!\n");
        return list;
    }
    p2 = p1->next;
    while(NULL != p2)
    {
        p3 = p2->next;
        p2->next = p1;
        p1 = p2;
        p2 = p3;    
    }
    list->next = NULL; 
    list = p1; 
    
    return list;     
}

void printList(List *list)
{
    if(NULL == list)
    {
        printf("list is NULL!\n");
        return;
    }    
    while(NULL != list)
    {
        printf("%d\n", list->data);
        list = list->next;
    }
}

void freeList(List *list)
{
    List *head;
    
    head = list;
    while(NULL != head)
    {
        list = head->next;
        free(head);
        head = list;
    }
    free(list);
}

int main(int argc, char *argv[])
{
    int arr[] = {3,5,6,2,8,10};
    List *list;
    
    list = creatList(arr, 6);
    printf("=========createList=========\n");
    printList(list);
    printf("=========createList=========\n");
    
    list = insertNodeBefore(list, 8);
    printf("=========insertNodeList=========\n");
    printList(list);
    printf("=========insertNodeList=========\n");
    
    list = deleteNode(list, 5);
    printf("=========deleteList=========\n");
    printList(list);
    printf("=========deleteList=========\n");
    
    list = revList(list);
    printf("=========revList=========\n");
    printList(list);
    printf("=========revList=========\n");
    
    freeList(list);
    
    return 0;
}

转载于:https://www.cnblogs.com/zhangpengme/archive/2012/10/28/2744127.html

单链表是一种线性数据结构,每个节点包含一个值和指向下一个节点的指针。在C语言中,我们可以创建一个简单的单链表结构体,包括头结点和基本的操作函数,如插入、删除和遍历等。这里是一个基础的单链表实现示例: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构 typedef struct ListNode { int data; struct ListNode* next; } ListNode; // 创建一个新的链表节点 ListNode* createNode(int value) { ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); if (newNode != NULL) { newNode->data = value; newNode->next = NULL; } return newNode; } // 插入节点到链表头部 void insertAtBegin(ListNode** head, int value) { ListNode* newNode = createNode(value); if (*head == NULL) { *head = newNode; } else { newNode->next = *head; *head = newNode; } } // 删除指定值的节点(仅删除第一个找到的) void deleteNode(ListNode** head, int value) { if (*head == NULL) { return; } if ((*head)->data == value) { ListNode* temp = *head; *head = (*head)->next; free(temp); return; } ListNode* current = *head; while (current->next != NULL && current->next->data != value) { current = current->next; } if (current->next != NULL) { ListNode* temp = current->next; current->next = current->next->next; free(temp); } } // 遍历打印链表 void printList(ListNode* head) { ListNode* temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); } int main() { // 初始化空链表 ListNode* head = NULL; // 插入节点 insertAtBegin(&head, 5); insertAtBegin(&head, 3); insertAtBegin(&head, 7); // 打印链表 printf("Original list: "); printList(head); // 删除节点 deleteNode(&head, 5); // 再次打印链表 printf("After deleting 5: "); printList(head); return 0; } ``` 这个例子展示了如何在C语言中创建一个单链表,以及执行插入、删除和遍历的基本操作。注意,这只是一个基础的实现未处理错误情况,实际使用时需要增加错误检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值