数据结构单链表的建立的使用

来源:互联网 发布:学吉他软件下载 编辑:程序博客网 时间:2024/05/22 11:57

建立单链表的意义:

储存数据 一般就是用的数组,灵活性也是很好的,但是数组的大小必须在开始的时候预先定义好,在未知的情况下就很容易损耗空间;

单链表:

链表是一组任意的储存单元来存储数据的,数据与数据之间物理上是可以不用联系的。例如下面的图:


也就是说空间是可以不连续的,这是他的优点之一;
对于数据ai链表除了存储他的本身值以外,还有链接下一个节点的起始地址,这样才能把数据的的逻辑关系体现成为一个“链”;
存储元素的信息的数据叫做数据域,放在其后面的地址称为指针域,每个节点只有一个指向后面的指针域所以称为单链表(后面会说到双链表就是有指向前面的和后面的);
链表是由多个节点组成的:如下图:

并定义头指针为 LinkList List;
下面上hi链表的示意图:

建立单链表:

建立单链表有两种方法为头插法尾插法
头插法:从空表开始每一个人进入的元素都插在头部,这样的插入式逆序的:形如下面的样子


相关代码:
LinkList Create_LinkList() //头插法建表{    LinkList List = NULL;  //list代表单链表    LNode *ele; // ele是指要输入的元素    int Data,flag = 0;    scanf("%d",&Data);    while(Data != flag)//flag为结束标志    {        ele = (LNode*)malloc(sizeof(LNode));        ele->data = Data;        ele->next = List;        List = ele;        scanf("%d",&Data);    }    return List;}




尾插法建表是和输入的数据是一样的:相对于头插法来说就是相对复杂一点了尾插法需要,就是添加一个一直指向尾部节点的指针r,建表情况形如下面:

相关代码:
LinkList Create_LinkList2() //尾插法建表{    LinkList List = NULL;    LNode *Ele,*Tail;    int Data,Flag = 0;    scanf("%d",&Data);    while(Data != Flag)    {        Ele = (LNode*)malloc(sizeof(LNode));        Ele->data = Data;        if(List == NULL){List->next = Ele;}        else{Tail->next = Ele;}        Tail = Ele;        scanf("%d",&Data);      //  printf("%d",Ele->data);    }    if(Tail == NULL){Tail->next = NULL;}    return List;}

求表的长度:

设计一个计数的i,每当指针移动一个的时候计数+1,
int Length_LinkList(LinkList L){    LNode *p = L;    int Len =1;    while(p->next)    {        Len++;        p=p->next;       // printf("%d\n",p->data);    }    return Len;}


查找操作:

查找分为按查找还是按内容查找:
第一种:
LNode *Get_LinkList(LinkList L,int i){    i--;//尾插法的时候--    i++; //头插法的时候++    LNode *Tar = L;    int j=0;    while(Tar->next!=NULL && j<i){Tar=Tar->next;j++;}    if(j== i)return Tar;    else return false;}

第二种:


LNode *Get_LinkList2(LinkList L,int e){    i--;//尾插法的时候--    i++; //头插法的时候++    LNode *P = L->next;    while(P!=NULL && P->data != e)        P=P->next;    return P;}


插入操作:



插入操作有三种1.在某节点之后插入2.定位插入3.在某节点之前插入

其实性质都是一样的,思路都是一样:
1.寻找节点
2.申请新节点
3.将新节点插入
代码如下:
int Insert_LinkList(LinkList L,int i,int e){    LNode *Pior,*This;    Pior = Get_LinkList(L,i-1);//查找到要插入元素的前一个   // printf("\n%dH\n\n",Pior->data);    if(Pior == NULL){printf("this is false");return false;}    else    {        This = (LNode*)malloc(sizeof(LNode));        This->data = e;        This->next = Pior->next;        Pior->next = This;        return 1;    }/**/}



删除操作:


这操作还是很简单的:就是把要删除的节点的前一个指向下一个的下一个,然后释放要删除的节点
int Delete_LinkList(LinkList L,int i){    LNode *P = L,*Pior;    int Len = Length_LinkList(L),j=0;    while(P->next != NULL && j<i)    {        j++;        P=P->next;    }    if(j == i){        Pior = Get_LinkList(L,i-1);    free(Pior->next);        Pior->next = Pior->next->next;    }    return 1;}



输出链表:

void Print_LinkList(LinkList L){    LNode *p = L;    int i=0;    int Len = Length_LinkList(L);    while(p)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n\n");}




修改链表中的元素:

基本思路就是找到要改变的的索引然后进行改
LNode Modify_LinkList(LinkList L,int i){    int e;    printf("请输入需要修改的值:");    scanf("%d",&e);    LNode *p = L;    int j=0;    while(p && j<i)    {        p=p->next;        j++;    }    if(j == i)    {        p->data = e;    }    printf("n\n");}



完整代码:
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<string.h>typedef struct LNode{    int data;    struct LNode *next;}*LinkList;//声明函数LinkList Create_LinkList();//建立单链表头插法LinkList Create_LinkList2();//尾插法建表int Length_LinkList(LinkList L);//求表长LNode *Get_LinkList(LinkList L,int i);//查找操作 按索引查找LNode *Get_LinkList2(LinkList L,int e);//查找操作  按值查找int Insert_LinkList(LinkList L,int i,int e);//插入操作int Delete_LinkList(LinkList L,int i); //删除操作LNode Modify_LinkList(LinkList L,int i);//修改操作void Print_LinkList(LinkList L);//声明结束LinkList Create_LinkList() //头插法建表{    LinkList List = NULL;  //list代表单链表    LNode *ele; // ele是指要输入的元素    int Data,flag = 0;    scanf("%d",&Data);    while(Data != flag)//flag为结束标志    {        ele = (LNode*)malloc(sizeof(LNode));        ele->data = Data;        ele->next = List;        List = ele;        scanf("%d",&Data);    }    return List;}LinkList Create_LinkList2() //尾插法建表{    LinkList List = NULL;    LNode *Ele,*Tail;    int Data,Flag = 0;    scanf("%d",&Data);    while(Data != Flag)    {        Ele = (LNode*)malloc(sizeof(LNode));        Ele->data = Data;        if(List == NULL){List->next = Ele;}        else{Tail->next = Ele;}        Tail = Ele;        scanf("%d",&Data);      //  printf("%d",Ele->data);    }    if(Tail == NULL){Tail->next = NULL;}    return List;}/*{    LinkList List;  //list代表单链表    LNode *Ele,*Tail = NULL;    int Data,Flag=0;    scanf("%d",&Data);    //Ele = (LNode*)malloc(sizeof(LNode));    //Ele->data = Data;    List = Ele;    Tail = Ele;    while(Data != Flag)    {        Ele = (LNode*)malloc(sizeof(LNode));        Ele->data = Data;        Tail->next = Ele;        Ele = Tail;        scanf("%d",&Data);        printf("%d\n",Ele->data);    }    return List;}*/int Length_LinkList(LinkList L){    LNode *p = L;    int Len =1;    while(p->next)    {        Len++;        p=p->next;       // printf("%d\n",p->data);    }    return Len;}LNode *Get_LinkList(LinkList L,int i){    i--;//尾插法的时候--    i++; //头插法的时候++    LNode *Tar = L;    int j=0;    while(Tar->next!=NULL && j<i){Tar=Tar->next;j++;}    if(j== i)return Tar;    else return false;}LNode *Get_LinkList2(LinkList L,int e){    i--;//尾插法的时候--    i++; //头插法的时候++    LNode *P = L->next;    while(P!=NULL && P->data != e)        P=P->next;    return P;}int Insert_LinkList(LinkList L,int i,int e){    LNode *Pior,*This;    Pior = Get_LinkList(L,i-1);//查找到要插入元素的前一个   // printf("\n%dH\n\n",Pior->data);    if(Pior == NULL){printf("this is false");return false;}    else    {        This = (LNode*)malloc(sizeof(LNode));        This->data = e;        This->next = Pior->next;        Pior->next = This;        return 1;    }/**/}void Print_LinkList(LinkList L){    LNode *p = L;    int i=0;    int Len = Length_LinkList(L);    while(p)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n\n");}int Delete_LinkList(LinkList L,int i){    LNode *P = L,*Pior;    int Len = Length_LinkList(L),j=0;    while(P->next != NULL && j<i)    {        j++;        P=P->next;    }    if(j == i){        Pior = Get_LinkList(L,i-1);    free(Pior->next);        Pior->next = Pior->next->next;    }    return 1;}LNode Modify_LinkList(LinkList L,int i){    int e;    printf("请输入需要修改的值:");    scanf("%d",&e);    LNode *p = L;    int j=0;    while(p && j<i)    {        p=p->next;        j++;    }    if(j == i)    {        p->data = e;    }    printf("n\n");}int main(){    LinkList LIST;    int i=2;    LNode *E,*F;    LIST = Create_LinkList();    int Len = Length_LinkList(LIST);    printf("%d\n",Len);    E = Get_LinkList(LIST,i);    F = Get_LinkList2(LIST,i);    Insert_LinkList(LIST,i,i);    Print_LinkList(LIST);    Delete_LinkList(LIST,i);    Print_LinkList(LIST);    Modify_LinkList(LIST,i);    Print_LinkList(LIST);    printf("F=%d\n",F->data);    printf("E=%d\n",E->data);    printf("Hello World");}










1 0
原创粉丝点击