线性表的链式结构实现
2016-01-22 22:54
363 查看
/* 6 线性表的链式结构实现 */ #include <stdio.h> #include <stdbool.h> #include <stdlib.h> typedef int TYPE;//定义数据类型别名 //声明结点结构体 typedef struct Node { TYPE data;//存储结点数据 struct Node* next;//指向下一节点 }Node; //声明链表结构体 typedef struct { Node* head;//头指针 int length;//链表长度 }lineList; /*对单链表的操作*/ bool init(lineList* list);//链表初始化 bool input(lineList* list,int pos,TYPE elem);//插入操作 /*因为使用了c++编译器,所以在delete后面加了1*/ TYPE delete1(lineList* list,int pos);//删除操作 int length(lineList* list);//链表长度 void traverse(lineList* list);//遍历操作 int search(lineList* list,TYPE elem);//查询指定元素的位置 void clear(lineList* list);//链表清空 void destroy(lineList* list);//销毁链表 int main() { lineList list; //初始化测试 bool flag=init(&list); if(flag) printf("初始化成功!\n"); else printf("初始化失败!\n"); for(int i=0;i<6;i++) //循环测试6次 { //插入操作测试 printf("输入插入的位置:"); int pos=0; scanf("%d",&pos); printf("输入插入的数值:"); TYPE elem=0; scanf("%d",&elem); flag=input(&list,pos,elem); if(flag) printf("插入成功!\n"); else printf("插入位置不合法,插入失败!\n"); //遍历操作测试 printf("遍历链表:"); traverse(&list); //链表长度测试 printf("链表的长度为:%d\n",length(&list)); //搜索链表 printf("输入要搜素的元素:"); scanf("%d",&elem); pos=search(&list,elem); if(pos!=-1) printf("元素%d在链表的第%d个位置\n",elem,pos); else printf("不存在,查找失败!\n"); //删除操作测试 printf("输入要删除的位置:"); scanf("%d",&pos); elem=delete1(&list,pos); if(elem!=-1) printf("删除的元素是:%d\n",elem); else printf("删除位置不合法或者链表已空,删除失败!\n"); printf("删除后遍历链表:"); traverse(&list); printf("删除后链表的长度为:%d\n",length(&list)); } //清空链表 clear(&list); printf("清空后遍历链表:"); traverse(&list); //销毁链表 destroy(&list); return 0; } //链表初始化 bool init(lineList* list) { Node* p=(Node*)malloc(sizeof(struct Node)); if(p) { p->next=NULL; list->head=p; list->length=0; return true; } else return false; } //插入操作 bool input(lineList* list,int pos,TYPE elem) { if(pos>0&&pos<=length(list)+1) { Node* p=(Node*)malloc(sizeof(struct Node)); if(p) { p->data=elem; Node* q=list->head; for(int i=1;i<pos;i++) { q=q->next; } p->next=q->next; q->next=p; list->length++; return true; } else return false; } else return false; } //删除操作 TYPE delete1(lineList* list,int pos) { if(0!=length(list)&&pos>0&&pos<=length(list)) { Node* p=list->head; for(int i=1;i<pos;i++) { p=p->next; } Node* q=p->next; TYPE elem=q->data; p->next=p->next->next; free(q); q=NULL; list->length--; return elem; } else return -1;//返回-1代表删除失败 } //链表长度 int length(lineList* list) { return list->length; } //遍历链表 void traverse(lineList* list) { Node* p=list->head->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); } //搜索链表 int search(lineList* list,TYPE elem) { Node* p=list->head->next; int pos=0; while(p) { if(p->data==elem) { break; } else { pos++; p=p->next; } } if(pos==length(list)) return -1; else return pos+1; } //清空链表 void clear(lineList* list) { destroy(list); init(list); } //销毁链表 void destroy(lineList* list) { Node* p=list->head->next; while(length(list)) { Node* q=p; p=p->next; free(q); q=NULL; list->length--; } free(list->head); list->head=NULL; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总