C语言链表(带头结点)

假设h是链表头指针,p是某一节点的指针
可以使用 Lnode h,p; 或 linklist h,p;
p->data 指向结点数据
p->next 指向下一个结点
动态申请存储空间 p=(Lnode *)malloc(sizeof(Lnode));
free(p)释放结点内存;

//
// Created by Administrator on 2021/10/8.
//
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct node//定义结构体并指明结构体名称
{
    elemtype data;//存储数据
    struct node *next;//指向下一个结点
}Lnode,*linklist;//别名

//单链表

//创建链表(头插法,带头指针)
Lnode * creat(int a[])//传入参数可自定义,这里使用数组传参
{
    Lnode *h,*p;
    h=(Lnode *)malloc(sizeof(Lnode));//头结点动态获取内存
    h->next=NULL;//初始化头结点
    int i=0;//辅助赋值
    while(a[i]){//循环赋值
        p=(Lnode *)malloc(sizeof(Lnode));//创建新结点
        p->data=a[i];//赋值
        p->next=h->next;//头插法插入结点
        h->next=p;//移动头结点
        i++;
    }
    return h;//返回头结点
}


//输出链表数据(带头结点时输入参数要去掉头结点)
void print(Lnode *p){
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;//移动结点位置
    }
    printf("\n");
}

//求链表长度(带头结点时输入参数要去掉头结点)
int length(Lnode *h){
    Lnode *p;
    p=h;
    int i=0;
    while(p!=NULL){
        p=p->next;
        i++;
    }
    return i;
}

void xs(){//分隔结果
    printf("----------------\n");
}

//链表插入
//插入到某结点后
void insert(Lnode *p,elemtype x){
    Lnode *s;
    s=(Lnode *) malloc(sizeof(Lnode));
    s->data=x;
    s->next=p->next;
    p->next=s;
}

//插入数据到链表的第i个结点之前
int insert(Lnode *h,int i,elemtype x){
    Lnode *p,*s;
    int j;
    p=h;
    j=0;
    while(p&&j<i-1){//寻找第i-1个结点
        p=p->next;
        j++;
    }
    if(p){
        s=(Lnode *) malloc(sizeof(Lnode));
        s->data=x;
        s->next=p->next;
        p->next=s;
        return(1);//正常结束
    }
    else{
        return(0);//插入失败
    }
}

//查找值为x的元素
Lnode * search(Lnode *h,elemtype x){
    Lnode *p;
    p=h->next;
    while(p&&p->data!=x){
        p=p->next;
    }
    return p;
}

//获取第i个元素地址
Lnode * get(Lnode *h,int i){
    int j;
    Lnode *p;
    p=h->next;
    j=1;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    if(j==i){
        return p;
    } else{
        return NULL;
    }
}

//链表逆置
int inverse(Lnode *h){
    Lnode *r,*q,*p;
    p=h->next;
    if(p==NULL){//链表为空
        return 0;
    }else if(p->next==NULL){//只有一个结点
        return 0;
    }
    q=p;
    p=p->next;
    q->next=NULL;
    while(p){
        r=p->next;
        p->next=q;
        q=p;
        p=r;
    }
    h->next=q;
    return 1;
}

//删除链表元素
void dele(Lnode *p){
    Lnode *q;
    if(p->next!=NULL){
        q=p->next;
        p->next=q->next;
        free(q);
    }
}


int main(){
    int a[5]={1,2,3,4,5};
    Lnode *p= creat(a);
    Lnode *q=p->next;
    print(q);
    xs();
    printf("%d\n", length(q));
    xs();
    insert(q,3,2);
    print(q);
    xs();
    Lnode *s= search(q,2);
    printf("%d\n",s->data);
    dele(s);
    xs();
    print(q);
    inverse(p);
    print(p->next);
}
posted @   浮生阁阁主  阅读(575)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示