数据结构实验二:单链表
2015-09-18 10:58
211 查看
代码实现的单链表的一些常规操作,如下。(代码中调用了自定义的table.h,后面有)
上述代码完好,均可copy使用。
/***************************************** Copyright (c) 2015 Jingshuang Hu @filename:demo.c @datetime:2015.09.18 @author:HJS @e-mail:eleftheria@163.com @blog:http://blog.csdn.net/hujingshuang *****************************************/ #include "table.h" /****************************************/ int main() { LinkList p = NULL; int num = 0, pos = 0, value = 0, value1 = 0, value2 = 0; List_Init(&p); while(1) { List_Menu(); scanf("%d", &num); switch(num) { case 1: printf("插入位置:"); scanf("%d", &pos); printf("插入值:"); scanf("%d", &value); List_Insert(p, pos, value); break; case 2: printf("删除位置:"); scanf("%d", &pos); List_Delete_Pos(p, pos); break; case 3: printf("删除元素:"); scanf("%d", &value); List_Delete_Elem(p, value); break; case 4: printf("替换位置:"); scanf("%d", &pos); printf("替换成:"); scanf("%d", &value); List_Replace_Pos(p, pos, value); break; case 5: printf("替换元素:"); scanf("%d", &value1); printf("替换成:"); scanf("%d", &value2); List_Replace_Elem(p, value1, value2); break; case 6: printf("查找位置:"); scanf("%d", &pos); List_Find_Pos(p, pos); break; case 7: printf("查找值:"); scanf("%d", &value); List_Find_Elem(p, value); break; case 8: List_Show_Length(p); break; case 9: List_Destroy(p); break; case 10: printf("\n程序结束!\n"); return 0; break; } List_Show_All(p); getchar();getchar(); system("cls"); } return 0; }其中table.h是有关单链表的结构体定义及函数声明,代码如下:
/***************************************** Copyright (c) 2015 Jingshuang Hu @filename:table.h @datetime:2015.09.18 @author:HJS @e-mail:eleftheria@163.com @blog:http://blog.csdn.net/hujingshuang *****************************************/ #ifndef _TABLE_H_ #define _TABLE_H_ /***************************************************/ #include <stdio.h> #include <stdlib.h> /***************************************************/ typedef struct node { int data; struct node *next; }Lnode, *LinkList; /***************************************************/ void List_Menu(void); void List_Init(LinkList *h); void List_Insert(LinkList h, int pos, int value); void List_Delete_Pos(LinkList h, int pos); void List_Delete_Elem(LinkList h, int value); void List_Find_Pos(LinkList h, int pos); void List_Find_Elem(LinkList h, int value); void List_Replace_Pos(LinkList h, int pos, int value); void List_Replace_Elem(LinkList h, int value1, int value2); void List_Show_All(LinkList h); void List_Show_Length(LinkList h); void List_Destroy(LinkList h); /***************************************************/ #endiftable.c是table.h函数的具体实现,代码如下:
/**************************************************** Copyright (c) 2015 Jingshuang Hu @filename:table.c @datetime:2015.09.18 @author:HJS @e-mail:eleftheria@163.com @blog:http://blog.csdn.net/hujingshuang ****************************************************/ #include "table.h" /***************************************************/ void List_Menu(void) { printf("\n************单链表菜单************\n"); printf("1.插入元素\n"); printf("2.按位置删除\t3.按元素删除\n"); printf("4.按位置替换\t5.按元素替换\n"); printf("6.按位置查找\t7.按元素查找\n"); printf("8.查看表长\t9.销毁表\n"); printf("10.退出程序\n"); printf("**********************************\n"); printf("请选择:"); } /***************************************************/ void List_Init(LinkList *h)//二级指针 { *h = (LinkList)malloc(sizeof(Lnode));//生成头结点 if (!h) { printf("链表初始化失败!\n"); } (*h)->next = NULL;//头结点的指针域置为空 } /*******************插值(前插)********************/ void List_Insert(LinkList h, int pos, int value) { LinkList p = h, q; int i = 0; if (!p->next && pos == 1)//表为空 { q = (LinkList)malloc(sizeof(Lnode)); if (!q) { printf("不能生成新的节点!\n"); } q->data = value; q->next = p->next; p->next = q; } else { while(p->next && i < pos - 1) { p = p->next; i++; } if (!p->next || i > pos - 1) { printf("位置不合法!\n"); } else { q = (LinkList)malloc(sizeof(Lnode)); if (!q) { printf("不能生成新的节点!\n"); } q->data = value; q->next = p->next; p->next = q; } } } /********************删除***************************/ void List_Delete_Pos(LinkList h, int pos) { LinkList p = h, q; int i = 0; while(p->next && i < pos - 1) { p = p->next; i++; } if (!p->next || i > pos - 1) { printf("位置不合法!\n"); } else { q = p->next; p->next = q->next; printf("删除元素为:%d\n", q->data); free(q); } } /***************************************************/ void List_Delete_Elem(LinkList h, int value) { LinkList p = h, q; int i = 0, flag = 0; while(p->next) { if (p->next->data == value) { flag++; q = p->next; p->next = p->next->next; free(q); } else { p = p->next; } } if (flag) { printf("元素%d删除完毕!\n", value); } else { printf("未发现元素%d\n", value); } } /**********************替换*************************/ void List_Replace_Pos(LinkList h, int pos, int value) { LinkList p = h->next; int i = 0; while(p && i < pos - 1) { p = p->next; i++; } if (!p || i > pos - 1) { printf("位置不合法!\n"); } else { p->data = value; } } /***************************************************/ void List_Replace_Elem(LinkList h, int value1, int value2) { LinkList p = h->next; int flag = 0; while(p) { if (p->data == value1) { flag++; p->data = value2; } p = p->next; } if (flag) { printf("已将%d替换成%d\n", value1, value2); } else { printf("未发现元素%d\n", value1); } } /********************查找**************************/ void List_Find_Pos(LinkList h, int pos) { LinkList p = h->next; int i = 0; while(p && i < pos - 1) { i++; p = p->next; } if (!p || i > pos - 1) { printf("位置不合法!\n"); } else { printf("%d\n", p->data); } } /***************************************************/ void List_Find_Elem(LinkList h, int value) { LinkList p = h->next; int i = 0, flag = 0; while(p) { i++; if (p->data == value) { flag++; printf("%d ", i); } p = p->next; } printf("共查找到%d个元素\n", flag); } /********************显示***************************/ void List_Show_All(LinkList h) { LinkList p = h->next; if (!p) { printf("表空!\n"); } else { while(p) { printf("%d ", p->data); p = p->next; } printf("\n"); } } /***************************************************/ void List_Show_Length(LinkList h) { int len = 0; LinkList p = h->next; while(p) { len++; p = p->next; } printf("length=%d\n", len); } /**********************销毁*************************/ void List_Destroy(LinkList h) { LinkList p = h, q; while(p->next) { q = p->next; p->next = q->next; free(q); } }
上述代码完好,均可copy使用。
相关文章推荐
- 【数据结构】线性表的链式存储结构--单链表
- 数据结构分类
- 项目4--顺序表应用 问题二
- 第三周 线性表(-)--顺序表 项目四--顺序表的应用 问题一
- 第3周SHH数据结构—【项目1-顺序表的基本运算】
- 第三周 项目3-单链表应用
- 二叉树的性质
- 顺序循环队列的基本操作
- 【项目5 线性表-- 顺序表存储应用】分离元素<之二>
- 【项目5 线性表-- 顺序表存储应用】分离元素<之一>
- 数据结构与算法学习1——算法复杂度分析
- 【数据结构之旅】顺序栈入门操作
- 【数据结构之旅】顺序栈入门操作
- 关于数据结构的学习经验分享 (链表相关的内容)
- 「数据结构」红黑树
- 关于数据结构的学习经验分享 (字符串相关的)
- 数据结构学习3--栈的实现(c++)
- 浅谈数据结构-归并排序
- 研磨数据结构与算法-02各种排序算法
- 数据结构学习小结(1)-----线性结构-----线性表