数据结构之链表

来源:互联网 发布:骑马与砍杀捏脸数据男 编辑:程序博客网 时间:2024/05/18 07:20

链表

作者:Tinuv 时间:2017.9.02
  • 单链表
    • 单链表的创建
    • 头插法创建单链表
    • 尾插法创建单链表
    • 单链表的基本操作
    • 插入操作
  • 双向链表

单链表

单链表的创建

头插法建表

#include <stdio.h>#include <malloc.h>typedef struct node {    int data;    struct node *next;} linklist;int main() {    int a[] = {12,23,45,56,78};    int length=5;    linklist *p = (linklist*)malloc(sizeof(linklist));    linklist *h,*temp;    p->next = NULL;    for(int i=0; i<length; i++) {        h=(linklist*)malloc(sizeof(linklist));        h->data = a[i];        h->next = p->next;        p->next = h;    }    temp = p->next;    while(temp) {        printf("%d ",temp->data);        temp = temp->next;    }    return 0;}

尾插法建表

#include <stdio.h>#include <malloc.h>typedef struct node {    int data;    struct node *next;} linklist;int main() {    int a[] = {12,23,45,56,78};    int length = 5;    linklist *h,*r,*t;    h = (linklist*)malloc(sizeof(linklist));    r = h;    for(int i=0; i<length; i++) {        t =(linklist*) malloc(sizeof(linklist));        t->data = a[i];        r->next = t;        r = t;    }    r->next=NULL;    linklist *p;    p = h;    while(p->next) {        p = p->next;        printf("%d  ",p->data);    }    return 0;}

注意:指针 的赋值是地址的赋值,当把指针赋值给另一个指针的时候,另一个指针也就获得了这个个指针的地址,当用另一个指针对内存空间操作的时候原有指针指向的内存空间也会发生改变,如r=h,在第一次循环中,r->next=t,在事实上h指针指向的内存空间的指针域也发生了变化

单链表的基本操作

单链表的插入操作

链表的插入操作是链表的优势之一,相比顺序表,它不用移动大量位置的操作,因此提升了效率.
单链表插入操作的核心算法是找到待插入之前的的位置并使其指针域指向新插入的结构,再将新建立的结构的指针指向其要插入的位置.

        //要插入第三个位置,注意不是指下标的3    linklist *temp;                 temp = h;    while(count<3-1) {        temp = temp->next;  //通过循环找到待插入的位置之前的那个点,并把指针赋值给temp;        count++;    }    linklist *insertdata;   //要插入的数据(结构)    insertdata = (linklist*)malloc(sizeof(linklist)); //创建一个内存空间    insertdata->data=100;             //赋值给新建结构数据域    insertdata->next = temp->next;    //将新建结构体的指针域赋值第二个结构指针域指向的位置,即原第三个结构体;    temp->next=insertdata;            //将第二个结构体指针域指向新建结构体;

单链表的删除操作

单链表的删除操作跟插入操作区别不大.都是找到待操作对象的前一个,然后对指针进行操作

双向链表

双向链表有两个指针域,用于指向前驱结点和后继结点

双向链表的创建

#include <stdio.h>#include <malloc.h>int main(){    typedef struct node {        int data;              //数据域        struct node *next;     //后继节点        struct node *prior;    //前驱节点    } linklist;    linklist *h,*n,*t;                          //t为尾节点    h = (linklist*)malloc(sizeof(linklist));    //头节点    h->prior=NULL;                              //头节点的前驱节点为空    int a[] = {12,23,45,56,78};                     int length=5;    int i;    t = h;                                       //开始时尾节点指向头节点    for(i=0;i<length;i++){        n=(linklist*)malloc(sizeof(linklist));  //新建一个节点        n->data=a[i];                           //给数据域赋值        n->prior=t;                             //插入到头节点的后面(将前驱节点指向头节点,第一次循环时t为头节点)        t->next=n;                              //后继节点指向新建节点        t=n;                                    //让尾节点指向新建节点    }    t->next=NULL;                                    //循环最后让尾节点指向null    linklist *temp;    temp=t;    while(temp->prior!=NULL){                         //双链表有既有前驱节点又有后继节点,可从尾节点遍历表        printf("%d  ",temp->data);        temp=temp->prior;    }    return 0;}
原创粉丝点击