c语言_数据结构_单链表
2014-08-13 12:04
183 查看
将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,通过地址或指针建立它们之间的联系,所得到的存储结构为链表结构,表中ai的结点形式如图表示:
其中结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai+1所在的结点。单链表结构如下:
单链表的建立:
其中结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai+1所在的结点。单链表结构如下:
单链表的建立:
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> #include <unistd.h> typedef int datatype; //声明结点,结点包括元素数据以及指针域。 typedef struct node { datatype data; struct node *next; }linknode,*linklist; //初始化链表。1)分配内存;2)将头节点指针域指向空,该指向也是链表遍历的判断依据;3)返回头节点地址。 linklist init_list(void) { linklist head = (linklist)malloc(sizeof(linknode)); head->next = NULL; return head; } //插入结点。1)新建结点,对于链表来说,不同于顺序表一次性将总表长的内存分配完毕,因此在每次新建 //结点都该给新结点newnode分配内存;2)将插入的数据赋予newnode的data域;3)定义中间结点p,p主要在 //遍历过程中起作用,初始化p等于head头结点进行遍历,当p->next指向NULL时,说明当前结点为末结点, //否则继续遍历下一结点;4)在找到末结点后,将末结点p->next指针指向新结点newnode,新结 //点newnode->next指向NULL,此时完成新结点的插入,新结点newnode成为末结点。 bool insert_list(linklist head,datatype n) { linklist newnode = (linklist)malloc(sizeof(linknode)); newnode->data = n; linklist p = head; while(p->next !=NULL) p = p->next; newnode->next = p->next; p->next = newnode; return true; } //删除结点。对链表遍历,当找到对应元素结点q时,记录其直接前驱结点p,将前驱结点的next域p->next指向 //q的直接后继结点p->next->next,释放q内存,完成删除工作。 bool remove_list(linklist head,datatype n) { linklist p = head; linklist q; while(p->next != NULL) { if(p->next->data == n) { q = p->next; p->next = p->next->next; free(q); return true; } p = p->next; } printf("remove failed\n"); return false; } //打印结点。 void show_list(linklist head) { linklist p = head; while(p->next != NULL) { p = p->next; printf("%d\t",p->data); } printf("\n"); } //链表逆转。依次将结点a0,a1,a2,……,an-1移到头结点作为其直接后继结点。如图:
void revert_list(linklist head) { linklist p = head->next; linklist q; head->next = NULL; while(p != NULL) { q = p->next; p->next = head->next; head->next = p; p = q; } } //测试。输入正数则插入结点,负数则删除对应结点,最后逆转链表。 int main(void) { datatype n; linklist l = init_list(); while((scanf("%d",&n)) == 1) { if(n > 0) { if((insert_list(l,n))) show_list(l); else printf("insert failed\n"); } else { if((remove_list(l,-n))) show_list(l); else printf("remove failed\n"); } } revert_list(l); printf("revert linklist:\n"); show_list(l); return 0; }
相关文章推荐
- 数据结构 学习笔记之:静态链表--史上最简单的C语言实现——只为掌握概念——不清楚静态链表的鸟鸟们有福了!
- 数据结构之---c语言实现单链表
- 数据结构实验之链表六:有序链表的建立(C语言)
- 数据结构——双循环链表一部分功能的C语言实现
- C语言-数据结构-双链表插入查找
- 数据结构(Data structure):用链表实现多项式的表示和运算(C语言)
- C语言中数据结构之链表归并排序实例代码
- 数据结构及算法——单链表逆转(C语言)(不间断更新)
- C语言 数据结构之链表实现代码
- 数据结构.单链表(C语言实现)
- 黑马程序员———C语言———【数据结构:单链表】
- c语言_数据结构_单向循环链表
- 数据结构——链表实现(c语言)
- C语言(7) - 数据结构之单向链表
- c语言实现通用数据结构(一):通用链表
- 数据结构之---C语言实现广义表头尾链表存储表示
- 数据结构基础(3)---C语言实现单链表
- C语言 数据结构 线性表 单链表 线性表的链式存储结构之一
- c语言实现单链表数据结构及其基本操作
- 数据结构——c语言描述 第二章(3) 双向链表