[转载(有删改)]单链表

申明:

转载   http://www.cnblogs.com/Romi/category/348304.html

链表:使用节点存储数据元素,节点的地址可以连续也可以不连续

单链表中一个节点的组成:数据域+指针域,指针于中存放的是是一个指针,指向下一个节点的地址。

内容包括:单链表的定义/初始化/查找节点/插入节点/删除节点

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<malloc.h>
  4
  5 //定义单链表
  6 struct node{
  7     char data;
  8     struct node *next;
  9 };
 10 typedef struct node linkList;
 11
 12 /*单链表结构
 13     p  0x804b008
 14     *0x804b008
 15         data  ‘\0‘
 16         next  0x804b018
 17         *0x804b018
 18             data  ‘a‘
 19             next  0x804b038
 20             *0x804b038
 21                 data  ‘s‘
 22                 next  ox804b048
 23                 *0x804b048
 24                     ...
 25 注:最后一个节点的next为NULL
 26 */
 27
 28 //初始化单链表(创建单链表)
 29 linkList* linkListCreate()
 30 {
 31     char ch;
 32     //p为创建的单链表,p2链接于p上,p1是p2与p之间的桥梁
 33     linkList *p,*p1,*p2;
 34     //初始化表头
 35     p=(linkList*)malloc(sizeof(linkList));
 36     p->data=‘\0‘;
 37     p->next=NULL;
 38     p1=p;//将p的首地址给p1,对p1的操作就是对p中元素的操作
 39     while((ch=getchar())!=‘\n‘)
 40     {
 41         p2=(linkList*)malloc(sizeof(linkList));
 42         p2->data=ch;
 43         p2->next=NULL;
 44         p1->next=p2;
 45         p1=p2;
 46     }
 47     return p;//返回链表头指针
 48 }
 49
 50 //查找节点:按序号查找,查找链表list中第n个节点。注:链表头的下一个节点才是第一个节点
 51 linkList * ElemLocatebyNum(linkList *list,int n)
 52 {
 53     int i=0;
 54     linkList *p;
 55     p=list;
 56     while(p!=NULL)
 57     {
 58         i++;
 59         p=p->next;
 60         if(n==i)
 61         {
 62             return p;
 63         }
 64     }
 65     return NULL;
 66 }
 67
 68 //查找节点:按数据元素查找,查找链表list中元素为ch的节点
 69 linkList * ElemLocatebyVal(linkList *list,char ch)
 70 {
 71     linkList *p;
 72     p=list;
 73     while(p!=NULL)
 74     {
 75         p=p->next;
 76         if(ch==p->data)
 77         {
 78             return p;
 79         }
 80     }
 81     return NULL;
 82 }
 83
 84 //插入节点:在链表list的第n个节点处插入元素ch
 85 void linkListInsert(linkList *list,int n,char ch)
 86 {
 87     linkList *p,*q;
 88     p=ElemLocatebyNum(list,n-1);//链表第n-1个节点
 89     if(p==NULL)
 90     {
 91         printf("insert error!\n");
 92         return;
 93     }
 94     q=(linkList*)malloc(sizeof(linkList));
 95     q->data=ch;
 96     q->next=p->next;
 97     p->next=q;
 98 }
 99
100 //删除节点:删除链表list的第n个节点
101 void linkListDelete(linkList *list,int n)
102 {
103     linkList *p,*q;
104     p=ElemLocatebyNum(list,n-1);//链表第n-1个节点
105     //q=ElemLocatebyNum(list,n);//链表的第n个节点
106     if(p->next==NULL || p==NULL)
107     {
108         printf("delete error!\n");
109         return;
110     }
111     q=p->next;
112     p->next=q->next;
113     free(q);//释放第n个节点的内存空间
114 }
115
116 int main()
117 {
118     //创建链表
119     linkList *p,*q;
120     p=linkListCreate();
121     q=p->next;//单链表的第一个节点
122     printf("craete list/elment:\n");
123     while(q)
124     {
125         printf("%c",q->data);
126         q=q->next;
127     }
128     printf("\n");
129     //查找节点:按序号
130     q=ElemLocatebyNum(p,4);
131     printf("find node/positon 4 elment:%c\n",q->data);
132     //查找节点:按数据元素
133     q=ElemLocatebyVal(p,‘j‘);
134     printf("find node/element is:%c\n",q->data);
135     //插入节点
136     linkListInsert(p,4,‘Q‘);
137     q=p->next;
138     printf("insert node/elment:\n");
139     while(q)
140     {
141         printf("%c",q->data);
142         q=q->next;
143     }
144     printf("\n");
145     //删除节点
146     linkListDelete(p,7);
147     q=p->next;
148     printf("delete node/elment:\n");
149     while(q)
150     {
151         printf("%c",q->data);
152         q=q->next;
153     }
154     printf("\n");
155     return 0;
156 }

1.链表初始化:这里有一个链表头,用于指向链表的头节点,即链表头的下一个节点即为链表的第一个节点。

2.查找节点,有两种查找方式,按序号查找和按数据元素查找。

3.插入节点,一定要注意操作的先后顺序。

4.删除节点,最后一定要将删除节点的内存空间释放掉,避免造成内存泄漏。

时间: 2024-10-18 04:28:33

[转载(有删改)]单链表的相关文章

判断单链表是否有环相关问题(转载加总结)

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

(转载)C语言单链表实现19个功能完全详解

最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能.到目前我只写了一半,先传上来,大家有兴趣的可以帮忙指正,谢谢 在vs2010上面编译运行无错误. 每天都会把我写的新代码添加到这个里面.直到此链表完成. #include "stdafx.h" #include "stdio.h" #include <stdlib.h> #in

java实现单链表增删改查

package 数据结构算法.链表; /* *定义节点 * 链表由节点构成 */ public class Node<E> { private E e; //数据data private Node<E> next; //指向下一个节点 public Node() { } public Node(E e) { this.e = e; } public Node<E> getNext() { return next; } public void setNext(Node&l

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

单链表的建立和增删改查代码及讲解

//---单链表的单链式存储结构---- typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; //1.初始化 int Initlist(LinkList L) { L=NULL; return OK; } //初始化(带头结点) int Initlist(LinkList L) { L=(LNode*)malloc(sizeof(Lnode));//为头结点分配内存空间 L->next=NULL;

数据结构复习--java实现单链表基本操作

单链表的基本操作包括建立单链表.查找运算(按序查找和按值查找).插入运算(前插和后插)和删除运算.下面给出具体的java实现程序: package com.zpp.test; //首先创建一个节点类 public class Node { private Node next; //指针域 private int data;//数据域 public Node( int data) { this. data = data; } } package com.zpp.test; public class

单链表的相关操作

#ifndef _SLIST_H #define _SLIST_H #ifdef __cplusplus extern "C" { #endif /*******1. 不带头结点的单链表*****/ /***** *@链表结点结构定义 *@ m_data:数据 *@m_pNext:指向下一结点的指针 ***/ struct listNode { int m_data; listNode* m_pNext; }; /******* *@ 用数组array初始化链表,数组元素个数为n *@

C实现通用数据结构--单链表

单链表概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 从概念上讲,可以把链表想象成一系列连续的元素,然而,由于这些元素是动态分配的(C语言中使用malloc),切记这些元素通常实际上都是分散在内存空间的 本文地址:http://www.cnblogs.com/archimedes/p/c-datastruct-linklist.html,转载请注明源地址. 单链表的接口定义: 1.list_init void list_init(Li

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历