【数据结构】单链表

来源:互联网 发布:淘宝买万艾可需要处方 编辑:程序博客网 时间:2024/06/06 12:54

代码实现的单链表的一些常规操作,如下。(代码中调用了自定义的table.h,后面有)

/***************************************** 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);/***************************************************/#endif
table.ctable.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使用。

0 0
原创粉丝点击