链表是一种在物理上非连续,非顺序的数据结构,若干个节点组成的链式存储结构,有效的利用了内存中零碎的空间。链表节点由数据域与指针域构成数据域:元素本身的信息指针域:元素(节点)间的联系#### 话不多说,上代码:vs2019已运行c/** 链表的基本实现* _6-1 顺">
赞
踩
顺序表的存储结构分为顺序存储结构和链式存储结构两种。相较于顺序表链表要难一点。
数据域:元素本身的信息
指针域:元素(节点)间的联系
/* * 链表的基本实现 * 1.头插法创建链表 * 2.尾插法创建链表 * 3.指定节点插入 * 4.指定节点删除 * 5.查找指定元素所在位置 * 6.修改指定节点元素 */ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int Elemtype; typedef struct Node { Elemtype data; int lenght;//记录表长 struct Node* next; }Node; /*头插法创建链表 此链表含表头节点,已在main函数中初始化*/ void HCreatelist(Node *L,Elemtype a[],int n) { Node* s; for (int i = 0; i < n; i++) { s = (Node*)malloc(sizeof(Node)); s->data = a[i]; s->next = L->next; L->next = s; } } /*尾插法创建链表 P指向链表头,如果只是使用一个s指针的话需要将第一个节点插入单独分开写 这里用p记入每一次插入前的尾节点 */ void LCreatelist (Node *L,Elemtype a[],int n) { Node* s,*p; p = L; for (int i = 0; i < n; i++) { s = (Node*)malloc(sizeof(Node)); s->data = a[i]; p->next = s; s->next = NULL; p = p->next; } } /*向指定位置插入元素*/ void Snodeins(Node* L) { Node* s,*l; l = L; int n;//用户输入指定插入位置 int i = 0; Elemtype N;//插入元素 printf("请输入插入节点位置:"); scanf("%d", &n); printf("输入添加的元素:"); scanf("%d", &N); //由于链表不像顺序表可以使用下标去寻找到指定位置 //所以我引入了l用来指向每次将要插入元素的节点 while (i < n - 1) { l = l->next; i++; } s = (Node*)malloc(sizeof(Node)); s->data = N; s->next = l->next; l->next = s; } void Snode_deletd(Node* L) { int n,i=0; Node* s,*p; s = L; printf("输入删除节点:"); scanf("%d", &n); while (i < n - 1) { s = s->next; i++; } p = s->next; s->next = s->next->next; printf("删除节点元素为:%d\n", p->data); free(p); } /*修改指定节点*/ void Mnode_Elem(Node* L) { int n, i = 0; Node* s; Elemtype e; s = L; printf("\n输入修改节点:"); scanf("%d", &n); printf("修改为:"); scanf("%d", &e); while (i < n - 1) { s = s->next; i++; } i= s->next->data; s->next->data = e; printf("已将第%d个节点修改为%d--->\n",i,e); } void Lookup(Node* L) { Node* s=L;//s从链表头开始 Elemtype e; int i=1,flag=0;//用来记录元素下标,flag标记是否出现相同元素 printf("需要查找的元素:"); scanf("%d", &e); while (s->next!= NULL)//当遍历到n-1时查看n是否为NULL { s = s->next; if (e == s->data) { printf("找到第%d个元素与所查元素相同", i); flag = 1; } i++; } if (flag == 0) printf("未找到相同元素!"); } void Print(Node* L) { Node* s; s = L->next; L->lenght = 0; while(s) { printf("%2d ", s->data); s = s->next; L->lenght++;//s->length都可以 } printf("\n打印结束!此链表一共有%d个节点\n",L->lenght); } int main() { Node* list; int n; Elemtype *p; list = (Node*)malloc(sizeof(Node)); list->next = NULL; list->lenght = 0; printf("请输入节点个数:"); scanf("%d", &n); if ((p = (Elemtype*)malloc(n * sizeof(Elemtype)))==NULL) //malloc分配是否成功 { printf("内存申请失败!"); exit(0); } printf("请输入节点元素:"); for(int i=0;i<n;i++) { scanf("%d", &p[i]); } LCreatelist(list, p, n); Print(list); //HCreatelist(list,p,n); Snodeins(list); Print(list); Snode_deletd(list); Print(list); Mnode_Elem(list); Print(list); Lookup(list); return 0; }
以上就是今天的内容,简单介绍了单链表的基本操作,等有空了就补上循环链表以及双链表和链表的反转问题。如果大家发现有什么错误欢迎评论指出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。