【算法和数据结构】_5_线性结构_单链表
来源:互联网 发布:网络体育关注 编辑:程序博客网 时间:2024/04/27 14:19
/* 本程序用来测试线性存储结构:链表*/#include <stdio.h>#include <stdlib.h>//*************************************************// 定义处理字符的链表数据类型struct singlelink{ short int data; struct singlelink* next;};//单链表struct doublelink{ int data; struct doublelink* prenode; struct doublelink* postnode;};//双链表typedef struct singlelink SIGLINK;typedef SIGLINK* PSIGLINK;typedef struct doublelink DBLLINK;//**************************************************//**************************************************// 定义申请地址空间宏#define MALLOC(pNode,Type,size)\ if(NULL==\ (pNode=(Type *)malloc(sizeof(Type)*size))\ )\{\ return FALSE;\}//**************************************************//**************************************************// 定义BOOL数据类型typedef enum {FALSE,TRUE} BOOL;//**************************************************SIGLINK* CreateSingleLink(void);BOOL InitSigLink(SIGLINK* head,char element[]);void EchoSigLink(PSIGLINK head);BOOL AppendToEnd(PSIGLINK head,char element);PSIGLINK SearchNodeSig(PSIGLINK head,char element);BOOL DelNodeSig(PSIGLINK head,char element);BOOL DestroySigLink(PSIGLINK head);BOOL IsSigLinkEmpty(PSIGLINK head);int main(int argc,char* argv[]){ PSIGLINK head; if(NULL==(head=CreateSingleLink())) { puts("Error.\n"); } if(IsSigLinkEmpty(head)) puts("Yes.\n"); if(!InitSigLink(head,"Hello wold")) { puts("Error.\n"); } EchoSigLink(head); AppendToEnd(head,'A'); EchoSigLink(head); if(SearchNodeSig(head,'e')) puts("Exist element"); DelNodeSig(head,'A'); EchoSigLink(head); if(DestroySigLink(head)) if(IsSigLinkEmpty(head)) puts("Yes.\n"); EchoSigLink(head); getchar(); getchar(); return 0;}//**************************************************/*函数功能: 创建链表的表头, 并将表头的数字域设置为 '\0' 、表头下一个指向域为空函数原型: SIGLINK* CreateSingleLink(void)函数参数: 无参数返回值: 如果创建表头成功,则返回表头指针;否则返回空指针异常: 无*/SIGLINK* CreateSingleLink(void){ SIGLINK* head; head=(SIGLINK*)malloc(sizeof(SIGLINK)); if(NULL==head) { return NULL; } head->next=NULL; head->data ='\0'; return head;}//**************************************************//**************************************************/*函数功能: 初始化链表:申请节点空间和设置值域函数原型: BOOL InitSigLink(SIGLINK* head,char element[])函数参数: SIGLINK* head:要初始化的链表头指针 char element[]:用来初始化链表以'\0'结尾的字符串返回值: 如果初始化成功,则返回TRUE;否则返回FALSE异常: 传递空指针*/BOOL InitSigLink(SIGLINK* head,char element[]){ PSIGLINK temp, end; int i; if(NULL==head || element==NULL ) { return FALSE; } end=head; for(i=0; element[i] != '\0';i++) { MALLOC(temp,SIGLINK,1); temp->data='\0'; temp->next =NULL; end->data=element[i]; end->next=temp; end=temp; } return TRUE;}//**************************************************//**************************************************/*函数功能: 显示链表函数原型: void EchoSigLink(PSIGLINK head)函数参数: PSIGLINK head: 要显示的链表的头指针返回值: 无异常: 传递空指针*/void EchoSigLink(PSIGLINK head){ PSIGLINK temp; if(NULL==head) { puts("Error.\n"); return ; } else { temp=head; while(NULL != temp->next ) { printf("%c",temp->data ); temp=temp->next ; } putchar('\n'); return ; }}//**************************************************//**************************************************/*函数功能: 获取最后一个节点的指针函数原型: PSIGLINK GetEndNode(PSIGLINK head)函数参数: PSIGLINK head:链表头指针返回值: 如果执行成功,则返回尾指针;否则返回NULL异常: 无*/PSIGLINK GetEndNode(PSIGLINK head){ PSIGLINK temp; if(!(temp=head)) { return NULL; } else { while(temp->next) { temp=temp->next ; } return temp; }}//**************************************************//**************************************************/*函数功能: 在链表的尾端增加节点函数原型: BOOL AppendToEnd(PSIGLINK head,char element)函数参数: PSIGLINK head:要增加元素的链表的头节点 char element:要增加的元素返回值: 成功增加返回TRUE,否则返回FALSE异常: 无*/BOOL AppendToEnd(PSIGLINK head,char element){ PSIGLINK end, temp; end=GetEndNode(head); if(!end) { return FALSE; } else { //分配空间,并设置最后一个节点 MALLOC(temp,SIGLINK,1) temp->data='\0'; temp->next =NULL; //将最后一个节点设置为新增的节点 end->data =element; end->next=temp; return TRUE; }}//**************************************************//**************************************************/*函数功能: 查找元素,函数原型 PSIGLINK SearchNodeSig(PSIGLINK head,char element)函数参数: PSIGLINK head:待查找头指针 char element:要查找的元素返回值: 如果存在就返回节点指针,否则返回NULL异常: 传递空指针*/PSIGLINK SearchNodeSig(PSIGLINK head,char element){ PSIGLINK temp; temp=head; //设计仅有表头节点的时候,不存储元素 //所以可以这样判断 if(!temp || !temp->next ) return NULL; while(temp->next) { if(element == temp->data ) { return temp; } temp=temp->next ; } return NULL;}//**************************************************//**************************************************/*函数功能: 在指定的元素后面插入节点, 1、如果指定元素存在就将节点插入到指定元素之后 2、如果指定元素不存在就插入到链表最后函数原型: BOOL InsertNodeSig(PSIGLINK head,char element)函数参数 PSIGLINK head:表头指针 char element:指定元素返回值: 插入成功,则返回TRUE,否则返回FALSE异常: 无*/BOOL InsertNodeSig(PSIGLINK head,char elementPos,char element){ PSIGLINK temp, NewNode; if(!head) { return FALSE; } //处理仅有头节点的情况 if(!head->next) { if(AppendToEnd(head,element)) return TRUE; else return FALSE; }/* //处理仅有一个节点的情况 //无论是否存在指定元素,都将插入一个节点 if(head->next->next ==NULL) { MALLOC(NewNode,SIGLINK,1); NewNode->data =element; NewNode->next=head->next ; head->next =NewNode; free(NewNode); return TRUE; }*/ temp=SearchNodeSig(head,elementPos); if(temp) { //存在指定元素 MALLOC(NewNode,SIGLINK,1); NewNode->data =element; NewNode->next =temp->next; temp->next =NewNode; free(NewNode); return TRUE; } else { //如果不存在指定元素,将元素插入到最后 if(AppendToEnd(head,element)) return TRUE; else return FALSE; }}//**************************************************//**************************************************/*函数功能: 删除指定元素函数原型: BOOL DelNodeSig(PSIGLINK *head,char element)函数参数: PSIGLINK *head: 链表头指针 char element:要删除的元素返回值: 如果删除成功,则返回TRUE;否则返回FALSE异常: 无*/BOOL DelNodeSig(PSIGLINK head,char element){ PSIGLINK temp, DeNode; //仅有头节点 if(!head->next) { return FALSE; } //仅有一个节点 if(!head->next->next) { if(head->data == element) { DeNode=head; head=head->next; free(DeNode); return TRUE; } else { return FALSE; } } temp=head; while(temp->next) { if(temp->next->data ==element) { DeNode=temp->next ; temp->next =temp->next ->next ; free(DeNode); return TRUE; } temp=temp->next ; } return FALSE;}//**************************************************//**************************************************/*函数功能: 销毁链表函数原型: BOOL DestroySigLink(PSIGLINK head)函数参数: PSIGLINK head: 待销毁链表头指针返回值: 成功销毁,返回TRUE,否则返回FALSE异常: 无*/BOOL DestroySigLink(PSIGLINK head){ PSIGLINK temp; if(NULL== head) { return FALSE; } else { if(head->next ==NULL) return TRUE; else { while(NULL != head->next->next ) { temp=head->next ; head->next=head->next->next; free(temp); } temp=head->next ; head->next =NULL; head->data ='\0'; free(temp); return TRUE; } }}//**************************************************//**************************************************/*函数功能: 判断是否为空表 1、仅有头节点时表为空函数原型 BOOL IsSigLinkEmpty(PSIGLINK head)函数参数: PSIGLINK head:链表头指针返回值: 如果为空,返回TRUE,否则返回FALSE异常: 无*/BOOL IsSigLinkEmpty(PSIGLINK head){ if(head && NULL==head->next ) return TRUE; else return FALSE;}//**************************************************
运行结果如下所示:
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 【算法和数据结构】_5_线性结构_单链表
- 【算法和数据结构】_6_线性结构_双链表
- 【算法和数据结构】_4_线性结构_队列
- 【算法和数据结构】_3_线性结构_栈
- 【算法和数据结构】_7_线性结构_字符串_模式匹配
- 【算法和数据结构】_9_线性结构_队列_续_1
- 数据结构_线性结构_线性表
- 数据结构与算法(线性表_链式存储结构)
- 数据结构与算法(线性表_链式存储结构)
- 数据结构:线性表的链式存储结构_单链表
- 09-数据结构_线性结构-离散存储-链表_插删伪算法
- 数据结构和算法笔记 lesson3 线性表顺序存储结构
- 网易 | 数据结构和算法 | 学习笔记02:线性结构
- 数据结构和算法笔记 lesson4 线性表链式存储结构 单链表
- 线性表之链式存储结构_单链表相关算法
- 数据结构与算法(线性表_顺序表存储结构)
- 数据结构与算法(线性表_顺序表存储结构)
- 数据结构-线性表_单链表
- HDU/HDOJ 1372 Knight Moves(骑士游走问题) 简单广度优先搜索
- 【贪心+排序】poj 2376 Cleaning Shifts
- 题目1047:素数判定
- SICP 习题(1.1,1.2,1.3,1.4)解题总结,起步。
- python学习笔记
- 【算法和数据结构】_5_线性结构_单链表
- while ((read = getline(&line, &len, fp)) != -1)
- Memcached 一致性hash原理
- [Direct3D] Surfaces (Direct3D 9)
- VB与API学习笔记(9)程序间的会话
- Payment Express 简述
- 链接
- Failed to execute goal org.apache.maven.plugins
- 程序员能力矩阵(Programmer Competency Matrix)