线性表玩具之链表版本(C语言)
来源:互联网 发布:数据库置疑修复语句 编辑:程序博客网 时间:2024/05/22 00:47
2009年3月26日 12:41 发表评论 阅读评论
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
本来不想发这么水的代码,可是最近也没什么好写的...纯当凑文章数目吧...
这是一个线性表操作的小玩具,此篇为链表版本,也就是用指针和动态内存分配的。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
/*线性链表操作Slyar 2009.3.26http://www.slyar.com*/ #include <stdio.h>#include <stdlib.h> /* 定义链表节点类型 */typedef struct node{ int data; struct node *next;}linklist; /* 函数声明部分 */linklist* Get(linklist*, int);linklist* CreateList();void FreeList(linklist*);void Output(linklist*);void AppendNode(linklist*, int);void InsertNode(linklist*, int, int);void ReadNode(linklist*, int);void SearchFromList(linklist*, int);void DeleteNode(linklist*, int);void UpdateNode(linklist*, int, int);void ListList(linklist*); /* 主函数 */int main(){int key,pos; char ch; linklist *slist; slist = CreateList(); while(1){ Output(slist); printf("请选择:"); ch=getchar(); fflush(stdin); if(ch == 'a') { printf("请输入要追加的数据:"); scanf("%d",&key); fflush(stdin); AppendNode(slist,key); Output(slist); } else if(ch == 'i') { printf("请输入要插入的数据的位置:"); scanf("%d",&pos); fflush(stdin); printf("请输入要插入的数据:"); scanf("%d",&key); fflush(stdin); InsertNode(slist,key,pos); Output(slist); } else if(ch == 'd') { printf("请输入要删除的数据的位置:"); scanf("%d",&pos); fflush(stdin); DeleteNode(slist,pos); Output(slist); } else if(ch == 'r') { printf("请输入要读取的数据的位置:"); scanf("%d",&pos); fflush(stdin); ReadNode(slist,pos); Output(slist); } else if(ch == 'u') { printf("请输入要修改的数据的位置:"); scanf("%d",&pos); fflush(stdin); printf("请输入要修改的数据:"); scanf("%d",&key); fflush(stdin); UpdateNode(slist,key,pos); Output(slist); } else if(ch == 's') { printf("请输入要查找的数据:"); scanf("%d",&key); fflush(stdin); SearchFromList(slist,key); Output(slist); } else if(ch == 'e') { FreeList(slist); exit(0); } } system("pause"); return 0;} /* 打印说明文档 */void Output(linklist *list){ system("cls"); printf("--------------------------------------/n"); printf("- 欢迎使用线性链表 -/n"); printf("- -/n"); printf("- 用法: -/n"); printf("- a: 追加一个节点 -/n"); printf("- i: 插入一个节点 -/n"); printf("- d: 删除一个节点 -/n"); printf("- r: 读取指定节点的值 -/n"); printf("- u: 修改指定节点的值 -/n"); printf("- s: 查找链表 -/n"); printf("- e: 退出 -/n"); printf("--------------------------------------/n"); ListList(list); } /* 创建线性链表 */linklist* CreateList(){ linklist *head, *r; head = (linklist*) malloc(sizeof(linklist)); if (head == NULL) { printf("内存不足,无法分配!/n"); system("pause"); } else { r = head; r -> next = NULL; } return head;} /* 打印线性链表 */void ListList(linklist* head){ linklist *p; p = head -> next; printf("当前链表的状态:/n"); if(p == NULL) { printf("当前链表为空/n"); } else { while(p != NULL) { printf("[%d]", p -> data); p = p -> next; } printf("/n"); }} /* 读取节点 */void ReadNode(linklist* head, int pos){ int j = 0; linklist *p; p = head; while((p -> next != NULL) && (j < pos)) { p = p -> next; j++; } if (pos == j) { printf("位置%d中的数据是:%d/n", pos, p -> data); } else { printf("所读取的位置超出链表的范围/n"); } system("pause");} /* 查找节点 */void SearchFromList(linklist* head, int n){ int i = 0, sign = 0; linklist *p; p = head -> next; while(p != NULL) { if(p -> data == n) { sign = 1; printf("在位置[%d]处找到此数据/n", i+1); } i++; p = p -> next; } if (!sign) { printf("找不到此数据!/n"); } system("pause");} /* 追加节点 */void AppendNode(linklist* head, int n){ linklist *p, *s; p = head; while(p -> next != NULL) { p = p -> next; } s = (linklist*) malloc(sizeof(linklist)); if (s == NULL) { printf("内存不足,无法追加!/n"); system("pause"); } else { s -> data = n; s -> next = p -> next; p -> next = s; }} /* 得到节点位置 */linklist* Get(linklist* head, int i){ int j = 0; linklist *p; p = head; while((p -> next != NULL) && (j < i)) { p = p -> next; j++; } if (i == j) { return p; } else { return NULL; }} /* 插入节点 */void InsertNode(linklist* list, int n, int pos){ linklist *p, *s; int j = pos - 1; p = Get(list, j); if (p == NULL) { printf("所插入的位置超出范围/n"); system("pause"); } else { s = (linklist*) malloc(sizeof(linklist)); if (s == NULL) { printf("内存不足,无法插入!/n"); system("pause"); } else { s -> data = n; s -> next = p -> next; p -> next = s; } }} /* 删除节点 */void DeleteNode(linklist* head, int pos){ linklist *p; int j = pos - 1; p = Get(head, j); if ((p != NULL) && (p -> next != NULL)) { linklist *r; r = p -> next; p -> next = r -> next; free(r); } else { printf("所要删除的位置超出链表的范围/n"); system("pause"); }} /* 编辑节点 */void UpdateNode(linklist *head, int n, int pos){ linklist *p; p = Get(head, pos); if (p == NULL) { printf("所读取的位置超出链表的范围/n"); system("pause"); } else { p -> data = n; }} /* 释放链表 */void FreeList(linklist* p){ if (p -> next != NULL) { FreeList(p -> next); } free(p);}
- 线性表玩具之链表版本(C语言)
- 线性表玩具之顺序表版本(C语言)
- C语言线性表之顺序表
- C语言数据结构之线性表
- C语言数据结构之线性表
- C语言数据结构之线性表(续)
- C语言线性表之单链表
- C语言线性表之循环单链表
- (续)线性表之双向链表(C语言实现)
- C语言线性表之双向循环链表
- C语言-线性表
- 线性链表(C语言实现)
- C语言实现线性顺序链表
- 线性链表的c语言实现
- C语言实现线性表
- c语言线性表详解
- 线性表 C语言实现
- 线性表 c语言 操作
- 已知二叉树的中序序列和前序序列(或后序)求解树
- C Primer Plus(第五版)中文版勘误
- 手算KMP匹配的Next值和Nextval值
- 定时每天备份mysql并定时删除上月记录(脚本)
- js判断checkbox是否至少有选择一项
- 线性表玩具之链表版本(C语言)
- 心算(手算)开平方,比较有用
- 线性表玩具之顺序表版本(C语言)
- 目前:菜鸟
- 检测点11.1
- Invoke的使用小结
- VPN技术的应用
- 字符串匹配算法:KMP学习心得
- 给一个日期,得出当月所有日期列表