【数据结构】链表的实现(带头节点)

来源:互联网 发布:html5media.min.js 编辑:程序博客网 时间:2024/06/05 05:34

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,每个结点包括数据域和指针域。
此处是带头结点的链表。

  • 结点结构体定义
typedef struct Linklist{    int data;//将int改为任何类型都可    struct Linklist *next;}LL;
  • 链表的建立

    • 头插法

      LL *headcreate_list(int n){LL *p,*q;p=NULL;srand(time(0));for(int i=0;i<=n;i++){    q=(LL *)malloc(sizeof(LL));    q->data=rand()/1000;    q->next=p;    p=q;} return p;} 
    • 尾插法

      LL *create_list(int n){LL *p,*r,*q;p=(LL*)malloc(sizeof(LL));p->next=NULL;r=p;srand(time(0));for(int i=1;i<=n;i++){    q=(LL*)malloc(sizeof(LL));    q->data=rand()/1000;    q->next=r->next;    r->next=q;    r=q;}return p;//p是头节点 }
  • 链表元素的插入

LL *insert_list(LL *p,int place,int e){    LL *q,*s;int j;    q=p;j=1;    while(j<place){        q=q->next;        j++;    }    s=(LL*)malloc(sizeof(LL));    s->data=e;    s->next=q->next;    q->next=s;    return p;}
  • 链表元素的删除
LL *delete_list(LL *p,int place){    int e,j=1;    LL *q,*r;    q=p;    while(j<place){        q=q->next;        j++;    }    e=q->next->data;    printf("被删除的元素为:%d\n",e);    r=q->next;    q->next=q->next->next;    free(r);    return p;}
  • 寻找元素在链表的位置
int LOCATE (LL *p,int e){    int i;    LL *q;    if(p){        i=1;        q=p->next;        while(q){            if(q->data==e) return i;            i++;            q=q->next;        }    }    return 0;}
  • 求链表长度
int LENGTH(LL *p){    LL *q;    int n=0;    if(p){        q=p->next;        while(q){            n++;            q=q->next;        }    }    return n;}
  • 链表逆置
LL *nizhi(LL *head){ //链表的逆置     LL *p,*pnext;    p=head->next;    head->next=NULL;    while(p){        pnext=p->next;        p->next=head->next;        head->next=p;        p=pnext;    }    return head;} 
  • 打印链表
void print_list(LL *p){    LL *q;    q=p->next;    if(!q) printf("Empty list.");    else while(q){        printf("%d ",q->data);        q=q->next;    }    printf("\n");}

完整代码实现:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>typedef struct Linklist{    int data;    struct Linklist *next;}LL;LL *create_list(int n);//尾插法 创建链表 LL *headcreate_list(int n);//头插法 创建链表 void print_list(LL *p);//打印链表 LL *insert_list(LL *p,int place,int e);//把e插入place位置LL *delete_list(LL *p,int place);//把place位置删除 int LOCATE(LL *p,int e);//寻找位置 int LENGTH(LL *p); //求长度    LL *nizhi(LL *p); //单链表的逆置 int main(){    LL *head;    int e,n,place1,place2;    printf("请输入建立链表元素个数:\n");    scanf("%d",&n);    //head=create_list(n);    head=headcreate_list(n);    printf("创建的链表为:\n");    print_list(head);    printf("插入的位置和元素:\n");     scanf("%d %d",&place1,&e);    printf("插入后的链表:\n");     head=insert_list(head,place1,e);    print_list(head);    printf("删除的位置:\n");    scanf("%d",&place2);    head=delete_list(head,place2);    printf("删除后的链表:\n");     print_list(head);    printf("请输入要查找的数:") ;    int ha;    scanf("%d",&ha);    int pl=LOCATE(head,ha);    printf("此元素在第%d个位置处\n",pl);     int shu=LENGTH(head);    printf("此时链表有%d个元素\n",shu);     head=nizhi(head);    printf("\n\n");    printf("输出逆置链表:\n");     print_list(head);    return 0;}LL *create_list(int n){    LL *p,*r,*q;    p=(LL*)malloc(sizeof(LL));    p->next=NULL;    r=p;    srand(time(0));    for(int i=1;i<=n;i++){        q=(LL*)malloc(sizeof(LL));        q->data=rand()/1000;        q->next=r->next;        r->next=q;        r=q;    }    return p;//p是头节点 }void print_list(LL *p){    LL *q;    q=p->next;    if(!q) printf("Empty list.");    else while(q){        printf("%d ",q->data);        q=q->next;    }    printf("\n");}LL *insert_list(LL *p,int place,int e){    LL *q,*s;int j;    q=p;j=1;    while(j<place){        q=q->next;        j++;    }    s=(LL*)malloc(sizeof(LL));    s->data=e;    s->next=q->next;    q->next=s;    return p;}LL *delete_list(LL *p,int place){    int e,j=1;    LL *q,*r;    q=p;    while(j<place){        q=q->next;        j++;    }    e=q->next->data;    printf("被删除的元素为:%d\n",e);    r=q->next;    q->next=q->next->next;    free(r);    return p;}LL *headcreate_list(int n){    LL *p,*q;    p=NULL;    srand(time(0));    for(int i=0;i<=n;i++){        q=(LL *)malloc(sizeof(LL));        q->data=rand()/1000;        q->next=p;        p=q;    }     return p;} int LOCATE (LL *p,int e){    int i;    LL *q;    if(p){        i=1;        q=p->next;        while(q){            if(q->data==e) return i;            i++;            q=q->next;        }    }    return 0;}int LENGTH(LL *p){    LL *q;    int n=0;    if(p){        q=p->next;        while(q){            n++;            q=q->next;        }    }    return n;}LL *nizhi(LL *head){ //链表的逆置     LL *p,*pnext;    p=head->next;    head->next=NULL;    while(p){        pnext=p->next;        p->next=head->next;        head->next=p;        p=pnext;    }    return head;} 
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 五个月婴儿拉稀怎么办 孩子老是着凉怎么办呢 五个月孩子拉肚子怎么办 肚子着凉了拉稀怎么办 小孩子着凉吐奶怎么办 儿童大便有粘液怎么办 宝宝拉鼻涕屎怎么办 婴儿拉白色粘液怎么办 宝宝不肯吃鱼肝油怎么办 婴儿不肯吃鱼肝油怎么办 宝宝吃鱼肝油吐怎么办 五个月婴儿夏天怎么办 厌奶期宝宝瘦了怎么办 二个月的宝宝不喝夜奶怎么办 婴儿不喝奶粉怎么办 小孩整天不吃饭怎么办 婴儿不吃不喝怎么办 断奶后不吃奶瓶怎么办 小孩早上不吃饭怎么办 新生儿不认乳头怎么办 宝宝不吸奶嘴怎么办 孩子不会吸奶瓶怎么办 宝宝突然不吃奶瓶怎么办 换了奶瓶不喝奶怎么办 新生儿不喝奶粉怎么办 7个月小婴儿磨牙怎么办 宝宝出生四天不喝母乳怎么办 我的奶水不足怎么办 乳牙长得不整齐怎么办 新生儿只吃奶粉怎么办 小孩不肯吸母乳怎么办 三个月宝宝不吃奶粉怎么办 宝宝不爱喝水怎么办 崔玉涛 小孩身体铅过高怎么办 疫苗引起的发烧怎么办 婴儿不吃米糊怎么办 宝宝米糊不吃怎么办 换奶瓶宝宝不吃怎么办 小孩不会吃奶瓶怎么办 百天不吃奶瓶怎么办 1岁宝宝积食怎么办