数据结构单链表的建立的使用
来源:互联网 发布:学吉他软件下载 编辑:程序博客网 时间: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
- 数据结构单链表的建立的使用
- Java数据结构,单链表的建立
- 数据结构单链表的建立、删除
- 数据结构 栈的建立
- 数据结构,空链表的建立
- 数据结构:多叉树的建立
- 【数据结构】堆的建立
- 数据结构---单链表的两种建立
- 数据结构_单链表的建立与反转
- 数据结构例程——单链表的建立
- 数据结构 链表 单链表的建立 C语言版
- 数据结构-邻接链表的建立和使用
- 数据结构 链表的建立
- 数据结构中链表的建立代码
- 【数据结构-排序】大根堆的建立
- 数据结构-二叉树的建立
- 单链表的建立以及使用
- C++ 数据结构的单链表的建立,插入,删除操作
- 最大熵模型的简单理解
- linux文件处理命令——文件处理命令
- typedef
- 使用堆栈将缺少左括号的表达式补全并计算其值
- 基础算法 KMP
- 数据结构单链表的建立的使用
- C-存储类型、初始化、链接属性的记录
- 基础算法 扩展KMP
- swift实现ios类似微信输入框跟随键盘弹出的效果
- Hibernate中的lazy(懒加载)属性
- pat1010Radix (25)
- 《深入理解Linux网络技术内幕》阅读笔记(十)
- Hibernate中cascade属性值
- OK6410与GPRS连接实现与PC机通信,Qt移植