数据结构与算法(3)--链表
来源:互联网 发布:软件授权使用协议书 编辑:程序博客网 时间:2024/06/07 11:56
1.链表的基础知识
首节点:
第一个有效节点
尾节点:
最后一个有效节点
头节点:
头节点的数据类型和首节点类型一样
是第一个有效节点之前的那个节点
头节点并不存放有效数据
加头节点的目的主要是为了方便对链表的操作
第一个有效节点
尾节点:
最后一个有效节点
头节点:
头节点的数据类型和首节点类型一样
是第一个有效节点之前的那个节点
头节点并不存放有效数据
加头节点的目的主要是为了方便对链表的操作
头指针:
指向头节点的指针变量
尾指针:
指向尾节点的指针变量
如果希望通过一个函数来对链表进行处理,我们只需要一个参数:头指针
泛型:不同的存储方式,执行的操作是一样的
指向头节点的指针变量
尾指针:
指向尾节点的指针变量
如果希望通过一个函数来对链表进行处理,我们只需要一个参数:头指针
泛型:不同的存储方式,执行的操作是一样的
2.链表的增删改查
#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct Node{int data; //数据域struct Node * pNext; //指针域}NODE , * PNODE;//NODE 等价于struct Node PNODE等价于struct Node *PNODE create_list(void);void traverse_list(PNODE pHead);bool is_empty(PNODE pHead);int length_list(PNODE);//可以省略参数名bool insert_list(PNODE,int ,int );//插入,参数:那个链表,插入位置,插入的值bool delete_list(PNODE,int ,int *);void sort_list(PNODE);int main(){int length;int val;PNODE create_list(void);PNODE pHead=NULL; //等价于 struct Node * pHead =NULLpHead=create_list();//create_list()功能:创建一个非循环单链表,并将该链表的头节点的地址赋给pHeadtraverse_list(pHead); //遍历is_empty(pHead); length=length_list(pHead);printf("链表长度=%d\n",length);printf("排序:");sort_list(pHead);traverse_list(pHead);insert_list(pHead,3,99 );traverse_list(pHead);if(delete_list(pHead,5,&val)==true){printf("删除成功 删除的数:%d ",val);}else{ printf(" 删除失败");}printf("\n");traverse_list(pHead); return 0;}PNODE create_list(void) //返回一个地址{int len;int i;int val; //用来临时存放用户输入的节点的 PNODE pHead=(PNODE)malloc(sizeof(NODE));//分配了一个不存放有效数据的头节点if(NULL==pHead){printf("分配失败,程序终止\n");exit(-1);}PNODE pTail=pHead; //定义一个pTail,使他永远指向为节点pTail->pNext=NULL; //这里只有一个头节点,相当于pTail也指向了尾节点printf("请输入您需要生产的链表节点的个数:len=");scanf("%d",&len);for(i=0;i<len;++i){printf("请输入第%d个节点的值:",i+1);scanf("%d",&val);PNODE pNew=(PNODE)malloc(sizeof(NODE)); if(NULL==pHead){printf("分配失败,程序终止\n");exit(-1);}pNew ->data =val; //每循环一次,生成一个新的节点,每次都把新的节点挂到pTail后面pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew;} return pHead;}void traverse_list(PNODE pHead){PNODE p=pHead->pNext;while(NULL!=p) //当p指向尾节点时,p为空{ printf("%d ",p->data); p=p->pNext;} printf("\n");}bool is_empty(PNODE pHead){if(pHead->pNext==NULL){printf("链表为空");return true;}else{ return false;}}int length_list(PNODE pHead){int len=0;while(pHead->pNext!=NULL){len++;pHead=pHead->pNext;} return len;}void sort_list(PNODE pHead){int i,j,t;PNODE p,q;for(i=0,p=pHead->pNext;i<length_list( pHead)-1;++i,p=p->pNext){ for(j=i+1,q=p->pNext;j<length_list(pHead);++j,q=q->pNext) {if(p->data > q->data){ t=p->data;p->data=q->data;q->data=t;}}}return ;}bool insert_list(PNODE pHead,int pos ,int val ){int i=0;PNODE p=pHead;while(p!=NULL && i<pos-1){p=p->pNext;i++;}if(i>pos || p==NULL){ return false;}PNODE pNew=(PNODE) malloc(sizeof(NODE));pNew->data=val;PNODE q=p->pNext; //上面程序已对链表进行循环,将p定位到插入位置p->pNext=pNew;pNew->pNext=q;return true;}bool delete_list(PNODE pHead,int pos,int * val) //利用指针在函数中更改全局变量val的值{int i=0;PNODE p=pHead;while(p!=NULL && i<pos-1){p=p->pNext;i++;}if(i>pos || p==NULL){ return false;}*val=p->pNext->data; //将删除的数据存入指针val所指向的地址中p->pNext=p->pNext->pNext; //删除节点p->pNextreturn true;}
0 0
- 数据结构与算法(3 Reverse链表)
- 数据结构与算法(3)--链表
- 数据结构与算法-基础数据结构(链表)
- 数据结构与算法-链表
- 数据结构与算法:链表
- 数据结构与算法 -- 链表
- 数据结构与算法:链表
- 数据结构与算法3:链表3
- 数据结构与算法3:链表1
- 数据结构与算法3:链表2
- 数据结构与算法--链表(1)
- 数据结构与算法(四)链表
- 数据结构与算法(3)--优先队列
- 数据结构,算法与应用(3)
- 算法与数据结构(3),并发结构
- 【数据结构与算法分析】链表
- 数据结构与算法JavaScript - 链表
- 数据结构与算法____链表
- 网站大并发处理
- 图片预览所遇到的获取图片尺寸问题
- HDU 1027 STL
- hdu 4578 Transformation 线段树
- 【教程】爱玩吧QQ空间说说刷赞网怎么刷秒赞教程
- 数据结构与算法(3)--链表
- Subversion版本管理工具服务器搭建与基本用法
- 01 docker 安装操作
- 输入三条边,判断三角形
- java类静态域、块,非静态域、块,构造函数的初始化顺序
- Qt 动态对话框
- Error和Exception
- 黑马程序员 JavaSE-02 Java基础语法1:基本概念
- 《复杂网络理论及应用》