数据结构之链表学习(2)
2014-01-14 01:14
169 查看
主要学习了链表的三个函数:插入节点,删除节点,排序。
(1)插入节点函数
1、传递的参数
参数主要有三个,链表的头结点Head,要插入的位置pos,要插入的元素的值val。
2、此函数的执行循序
首先,定义一个结构体指针变量p,方便后面的操作。然后一段代码
while(p->pnext!= NULL && i < pos -1)
{
p = p->pnext;
++ i;
}
的作用是将p指向要插入节点的前一个节点。假设要在第4个节点前面插入一个节点,则此代码会使p指向第三个节点。
![](http://img.blog.csdn.net/20140114003803250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWEdzaWxlbmNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20140114004209484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWEdzaWxlbmNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
然后利用if(p->pnext == NULL || i > pos -1)
return false;
来判断,如果不满足上面的要求就返回false。然后申请两个节点,一个是指向当前p的下一个节点,而另一个就是需要插入的节点。
![](http://img.blog.csdn.net/20140114005745015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWEdzaWxlbmNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
最后将它们连接起来p->pnext = pNew;pNew->pnext = q;
(2)删除节点函数
删除节点函数的前一部分跟插入节点函数基本心相同。然后将删除节点的后一节点的地址付给删除节点的前一节点的pnext,即p->pnext = p->pnext->pnext;
(3)排序节点元素
利用的方法是:将一个元素与它后面的所有元素进行比较找出最大值。
(4)链表完整的代码:
(1)插入节点函数
1、传递的参数
参数主要有三个,链表的头结点Head,要插入的位置pos,要插入的元素的值val。
2、此函数的执行循序
首先,定义一个结构体指针变量p,方便后面的操作。然后一段代码
while(p->pnext!= NULL && i < pos -1)
{
p = p->pnext;
++ i;
}
的作用是将p指向要插入节点的前一个节点。假设要在第4个节点前面插入一个节点,则此代码会使p指向第三个节点。
然后利用if(p->pnext == NULL || i > pos -1)
return false;
来判断,如果不满足上面的要求就返回false。然后申请两个节点,一个是指向当前p的下一个节点,而另一个就是需要插入的节点。
最后将它们连接起来p->pnext = pNew;pNew->pnext = q;
(2)删除节点函数
删除节点函数的前一部分跟插入节点函数基本心相同。然后将删除节点的后一节点的地址付给删除节点的前一节点的pnext,即p->pnext = p->pnext->pnext;
(3)排序节点元素
利用的方法是:将一个元素与它后面的所有元素进行比较找出最大值。
(4)链表完整的代码:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <stdbool.h> typedef struct node { int data;//数据域 struct node *pnext;//指针域 }Node, *pNode; /**创建链表**/ pNode Create_node(void) { pNode Head, p1, p2; int val,num,i; Head = (pNode)malloc(sizeof(Node));//p=(struct node *)malloc(sizeof(struct node)) Head->pnext = NULL; if(Head == NULL) { printf("内存分配失败,程序终止"); exit(-1); } ////////////////////////////////////////////////// p2 = Head; printf("请输入创建节点的个数:"); scanf("%d",&num); for(i = 0; i < num; i ++) { printf("请输入节点的值:"); scanf("%d",&val); p1 = (pNode) malloc(sizeof(Node)); p1->pnext = NULL; p1->data = val; p2->pnext = p1; p2 = p1; } return Head; } /**遍历链表**/ void traverse_list(pNode Head) { pNode p1; if(Head->pnext == NULL); // return; else { p1 = Head->pnext;//注意此处不是p1 = Head,而是p1 = Head->pnext printf("遍历后输出的值为:"); while(1) { if(p1->pnext == NULL) { printf("%d ",p1->data); break; } printf("%d ",p1->data); p1 = p1->pnext; } printf("\n"); } } /**判断链表是否为空**/ bool is_empty(pNode Head) { if(Head->pnext == NULL) { //printf("该链表为空"); return true; } //printf("该链表不为空"); return false; } /**求链表的长度**/ int length_list(pNode Head) { int i = 0; pNode p1; if(is_empty(Head)) printf("该链表为空\n"); else { p1 = Head->pnext; while(1) { if(p1->pnext == NULL) { i ++; break; } i ++; p1 = p1->pnext; } } //printf("链表的长度为:%d\n",i); return i; } /**插入元素**/ bool insert_list(pNode Head, int pos, int val) { int i = 0; pNode p; p = Head; while(p->pnext!= NULL && i < pos -1) { p = p->pnext; ++ i; }//将p指向要插入节点位置的前一个节点 if(p->pnext == NULL || i > pos -1)//i > pos -1的作用是当i取负值时的一种情况 return false; pNode pNew = (pNode)malloc(sizeof(Node)); if(pNew == NULL) { printf("动态内存分配失败"); exit(-1); } pNew->data = val; pNew->pnext = NULL; pNode q = p->pnext; p->pnext = pNew; pNew->pnext = q; return true; } /**删除元素**/ bool delete_list(pNode Head, int pos, int * val) { int i= 0; pNode p = Head; while(p->pnext != NULL && i < pos -1) { p = p->pnext; ++ i; } if(p->pnext == NULL || i > pos -1) return false; pNode q = p->pnext; *val = q->data; p->pnext = p->pnext->pnext; free(q); q = NULL; return true; } /**排序元素**/ void sort_list(pNode Head) { int i, j, t; pNode p, q; int len = length_list(Head); for(i = 0, p = Head->pnext; i < len - 1; i ++, p = p->pnext) for(j = i + 1,q = p->pnext; j < len -1; j ++,q = q->pnext) { if(p->data > q->data)//如果p->data > q->data 就将两个数进行交换 { t = p->data; p->data = q->data; q->data = t; } /***************** if(a[i] > a[j]) { t = a[i]; a[i] = a[j]; a[j] = t; } *****************/ } return ; } int main(void) { pNode pHead; int length,val; pHead = Create_node(); traverse_list(pHead); length = length_list(pHead); printf("链表的长度为%d:\n",length); sort_list(pHead);//排序 traverse_list(pHead); insert_list(pHead, 4, 33); traverse_list(pHead); delete_list(pHead, 4, &val); traverse_list(pHead); }
相关文章推荐
- 数据结构入门学习系列-5(链表的基本操作算法)
- 数据结构学习---有序链表的合并
- 数据结构学习心得——双链表和循环链表
- python数据结构学习笔记-4-链表
- 《Delphi 算法与数据结构》学习与感悟[7]: 链表与数组的异同
- Redis源码学习3-基本数据结构之双向链表
- 数据结构学习系列二-链表的C++实现
- 数据结构学习:利用链表建立二叉树
- 数据结构学习——栈的链表实现(程序化)
- 数据结构 链表学习笔记 2
- 数据结构学习笔记(二) 链表之带表头结点的单循环链表基本操作
- 数据结构学习---线性表链表实现
- Python数据结构学习之旋转链表详解
- 数据结构学习笔记--(4) 链表--第二节
- 数据结构学习之链表(单向、单循环以及双向)(递归实现)
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- 数据结构学习- 链表
- 数据结构学习笔记之一:链表
- 数据结构学习之双向链表
- C++算法学习——数据结构——链表(2)