链表

链表(linked list):链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
:使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,链表允许插入和移除表上任意位置上的结点,但是不允许随机读取。链表类型:单向链表,双向链表以及循环链表。


#include "stdlib.h"
#include "stdio.h"

//定义链表结点
struct node{
    int data;
    struct node *next;
};
typedef struct node node;
/*
*create
*函数功能:创建链表
*输入:创建结点个数n
*返回值:链表头指针head
*/
node *create(int n){
    node *head, *pf, *pb;//head链表头指针,pf为指向两相邻结点的前一结点的指针变量,pb为后一结点的指针变量
    head = (node *)malloc(sizeof(node));
    pf = head;
    for (int i = 0; i<n; i++){
        pb = (node *)malloc(sizeof(node));//在内存的动态存储区中分配一块长度为“sizeof(struct node)”字节的连续区域
        printf("请输入一个数据\n");
        scanf("%d", &(pb->data));
        pf->next = pb;
        pb->next = NULL;
        pf = pb;
    }
    return head;
}
/*
*insert
*函数功能:在链表中插入元素
*输入:head链表头指针,p新元素位置,x新元素中的数据域内容
*返回值:viod
*/
void insert(node* head, int p, int x){
    node* temp = head;
    for (int i =0; i<p - 1; i++){
        if (temp == NULL)//防止插入位置超出链表长度
            return;
        temp = temp->next;//取得p-1位置结点的指针,即插入位置前一个结点的指针
    }
    node* insert = (node*)malloc(sizeof(node));
    insert->data = x;
    insert->next = temp->next;
    temp->next = insert;
}
/*
*del
*函数功能:删除链表中的结点
*输入:head链表头指针,p被删除结点位置
*返回值:被删除结点的数据域,如果失败返回-1
*/
int del(node *head, int p){
    node *del = head, *temp;
    for (int i =0; i<p - 1; i++){
        if (del == NULL)
            return -1;
        del = del->next;
    }
    temp = del->next;
    int ret = del->next->data;
    del->next = temp->next;
    free(temp);
    return ret;
}
/*
*attach
*函数功能:连接两个链表
*输入:链表1的头指针head1;链表2的头指针head2
*返回值:返回连接后的头指针head1
*/
node * attach(node *head1,node *head2){
    node *temp;
    temp = head1;
    while (temp->next != NULL)
        temp = temp->next;
    temp->next = head2->next;
    return head1;
}
/*
*reverse
*函数功能:反序结点
*输入:链表头指针head
*返回:反序后链表的头指针head
*/
node * reverse(node *head){
    node *temp, *p1, *p2;
    p1 = NULL;
    p2 = head;
    while (p2){
        temp = p2->next;
        p2->next = p1;
        p1 = p2;
        p2 = temp;
    }
    node *h;
    h = (node *)malloc(sizeof(node));
    h->next = p1;
    return h;
}
/*
*print
*函数功能:打印链表
*输入:链表的头指针head
*返回:void
*/
void print(node * head){
    node *temp = head->next;
    while (temp){
        printf("%d\n", temp->data);
        temp = temp->next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值