链表(四)——带表头的单向链表
来源:互联网 发布:淘宝iphone官换机骗局 编辑:程序博客网 时间:2024/05/21 18:38
1.带表头的单向链表
(1)不带表头的单向链表在实现插入和删除时必须区分头结点和其他节点的处理。
(2)使用带表头的单向链表的好处:不用考虑头结点的单独处理。
表头节点:数据域没有值,指针域指向单向链表中数据域含值的第一个结点。
(1)不带表头的单向链表在实现插入和删除时必须区分头结点和其他节点的处理。
(2)使用带表头的单向链表的好处:不用考虑头结点的单独处理。
表头节点:数据域没有值,指针域指向单向链表中数据域含值的第一个结点。
2.代表头的单向链表的基本操作
#include <stdio.h>#include <malloc.h>#define NULL0typedef struct node {int data;struct node *next;}ElemSN;ElemSN * creat_link(int ms); //创建一个带表头的链表void print_link(ElemSN *head); //输出单向链表void delete_node(ElemSN *head, int x); //删除结点void insert_node(ElemSN *head, int x); //插入结点void clear_link(ElemSN *head); //删除链表int main(){ElemSN *head;int ms, x;printf("Please input node number:");scanf("%d", &ms);head = creat_link(ms); //创建链表print_link(head);printf("Please input delete node:");scanf("%d", &x);delete_node(head, x); //删除结点print_link(head);printf("Please input insert node:");scanf("%d", &x);insert_node(head, x);print_link(head);clear_link(head);print_link(head);}ElemSN * creat_link(int ms) //带表头的单向链表除了头结点其余结点 //创建方法一致,所以不用逆向创建{ElemSN *h = NULL, *p;int i, x;h = p = (ElemSN *)malloc(sizeof(ElemSN));for(i = 0; i < ms; i++){p->next = (ElemSN *)malloc(sizeof(ElemSN)); //创建新结点printf("Please input node data:");scanf("%d", &x);p->next->data = x; //新结点初始化p->next->next = NULL; //新结点初始化p = p->next;}return h;}void print_link(ElemSN *head){if(NULL == head->next){printf("Link is null.");}for(head=head->next; head; head = head->next){printf("%d ", head->data);}printf("\n");}void delete_node(ElemSN *head, int x){ElemSN *p, *q;for(p=head, q=head->next; q && q->data != x; p=q, q=q->next){}if(q != NULL){p->next = q->next;free(q);}}void insert_node(ElemSN *head, int x){ElemSN *p, *q;if(NULL == head)return;if(NULL == head->next) //链表为空时{head->next = (ElemSN *)malloc(sizeof(ElemSN));head->next->next = NULL;head->next->data = x;return;}p = head;q = head->next;if(NULL == q->next) //链表中只有一个元素时{p->next = (ElemSN *)malloc(sizeof(ElemSN));p->next->data = x;p->next->next = q;return;}if(q->data >= q->next->data) //递减链表{for(; q && q->data >= x; p = q, q = q->next){}}else //递增链表{for(; q && q->data <= x; p = q, q = q->next){}}if(NULL == q) //插入在链表尾部{q = (ElemSN *)malloc(sizeof(ElemSN));q->data = x;q->next = NULL;p->next = q;}else if(q == head->next) //插入在表首{q = (ElemSN *)malloc(sizeof(ElemSN));q->data = x;q->next = head->next;head->next = q;}else //插入在中间位置{p->next = (ElemSN *)malloc(sizeof(ElemSN));p->next->next = q;p->next->data = x;}}void clear_link(ElemSN *head){ElemSN *p;while(head->next){p = head->next;head->next = p->next;free(p);}}
1 0
- 链表(四)——带表头的单向链表
- 带表头的单向链表
- 带表头的单向循环链表
- 带表头结点的单向链表
- 带表头的单向链表实现(C语言)
- 不带表头的单向链表,带表头的单向链表,带表头的单向循环链表,带表头的双向循环链表。
- 链表(单链表,带表头的链表,单向循环链表,双向循环链表)
- 不带表头结点的非循环单向链表
- 带表头节点的单向循环链表编程
- 带表头节点的循环单向链表
- 不带表头节点的循环单向链表
- 不带表头结点的单向链表总结
- 判断带表头的单向循环链表La是否递增
- 创建不带表头结点的单向链表,并实现各种功能
- 创建带表头结点的单向链表,并实现各种功能
- 无表头节点的单向链表
- 单向带表头链表中找节点
- 带表头链表
- .set伪指令(mips)
- 关于祥琳望晴-雅晴 | AiY! 备忘录
- hdu1082
- 关于ARM的22个常用概念
- 耐得住寂寞才能守得住繁华
- 链表(四)——带表头的单向链表
- Android开发问题总结 --- 2014/07/20
- java.lang.ClassCastException: cn.study.model.User_$$_javassist_0 cannot be cast to javassist.util.pr
- 大牛android博客
- [线段树] POJ 3468 A Simple Problem with Integers
- Libgdx: android单机斗地主支持局域网wifi联网的网络模块核心代码
- 代理服务器proxy server
- 随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
- Windows下Subversion和Apache的安装及配置(一)