重新温习链表

链表有两种实现方案,一是有头节点,二是无头节点。

方案一中有头节点,指向头节点的指针叫做头指针,但是头节点只是为了操作统一方便,头节点的数据域为空或者存储链表的长度等信息,只有头节点的链表叫做空链表。

方案二中没有头节点,空链表的意义为头指针指向NULL,

方案一源码

// 此头文件包含链表的基本操作
// 类型:单链表
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct linklist
{
 ElemType nodeData;   // 数据区域
 struct linklist *next;  // 指针区域,指向链表的下一个节点
} node;
// 构造一个空的链表
node *InitList()
{
 node *head;
 head=(node *)malloc(sizeof(node));
 head->nodeData=0;    // 头节点中的数据域表示这个链表中的长度
 head->next=NULL;
 return head;
}
// 销毁线性表
int ClearList(node *head)
{
 node *temp;
 while(!head)
 {
  temp=head;
  head=head->next;
  free(temp);
 }
 return 0;
}
// 链表判空,为空返回0,不空返回1
int LinkEmpty(node *head)
{
 return head->next==NULL?0:1;
}
// 返回链表的长度
int ListLength(node *head)
{
 return head->nodeData;
}
// 取回第i个节点的数据
ElemType GetElem(node *head,int i)
{
 node *temp;
 temp=head;
 if(i<0||i>head->nodeData)
 {
  printf("Parameter Error");
  exit(1);
 }
 while(i-->0)
 {
  temp=temp->next;
 }
 return temp->nodeData;
}
// 删除第i个节点
ElemType DeleteElem(node *head,int i)
{
 int ret;
 node *temp;
 temp=head;
 if(i<0||i>head->nodeData)
 {
  printf("Parameter Error");
  exit(1);
 }
 while(i-->0)
 {
  temp=temp->next;
 }
 ret=temp->nodeData;
 free(temp);
 return ret;
}
// 插入数据元素,head是头指针,dat是插入的数据,i是插入位置
ListInsert(node *head,ElemType dat,int i)
{
 node *temp,*TMP;
 TMP=head->next;     // 这个变量用于寻找插入位置的前驱节点
 temp=(node *)malloc(sizeof(node));  // 这是用于插入的节点
 temp->nodeData=dat;
 if(i<0||i>head->nodeData+1)
 {
  printf("Parameter Error");
  exit(1);
 }
 else if(i==1)
 {
  temp->next=head->next;
  head->next=temp;
  head->nodeData++;
 }
 else
 {
  while(--i>1)   // 找到要插入位置的前驱节点
  {
   TMP=TMP->next;
  }
  temp->next=TMP->next;
  TMP->next=temp;
  head->nodeData++;
 }
}
int main()
{
 node *head;
 head=InitList();
 ListInsert(head,3,1);
 printf("%d\n",GetElem(head,1));
}
时间: 2024-10-30 23:20:47

重新温习链表的相关文章

单链表的应用——人事信息管理系统

// 闲来无事,写几行代码,温习一下单链表,功能不全,可补充. /////////////////////////////////////////////////// /*Person Information Management System-PIMY *功能菜单///////////////////////////////////////// *1. 添加////////////////////////////////////////// *2. 删除////////////////////

jdk1.8 HashMap 实现 数组+链表/红黑树

转载至 http://www.cnblogs.com/leesf456/p/5242233.html 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也可以使用红黑树进行存储,总之,目标只有一个,那就是在安全和功能性完备的情况下让其速度更快,提升性能.好~下面就开始分析源码. 二.HashMap数据结构 说明:上图很形象的展示了HashMap的数据

单链表的初始化,整表创建,单个元素插入,单个元素删除,整表删除等操作

很早之前学的数据结构,放了很久后,以致对里面的一些操作都有些遗忘,故而再次温习了一下数据结构,并整理了一点儿笔记,放在这里和大家分享, 我的代码注释的已经很详细了,对于容易出错的地方我也都有标注,欢迎大家交流. #include "stdafx.h" #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <time.h> #define OK 1 #defi

【超详细】一文学会链表解题

前言 如果说数据结构是算法的基础,那么数组和链表就是数据结构的基础. 因为像堆,栈,对,图等比较复杂的数组结基本上都可以由数组和链表来表示,所以掌握数组和链表的基本操作十分重要. 今天就来看看链表的基本操作及其在面试中的常见解题思路,本文将从以下几个点来讲解链表的核心知识 什么是链表,链表的优缺点 链表的表示及基本操作 面试中链表的常见解题思路---翻转 面试中链表的常见解题思路---快慢指针 什么是链表 相信大家已经开始迫不及待地想用链表解题了,不过在开始之前我们还是要先来温习下链表的定义,以

c语言动态链表的创建

创建动态连链表就是将一个个节点连接起来 (1)动态生成节点 (2)输入节点数据 (3)将节点链在一起 例: typedef struct Data { char num[20]; char name[10]; char sex; float english; float chinese; float math; }; typedef struct Node { struct Data data;//结构体类型//结构体嵌套 struct Node* next;//结构体指针型 }node,*Pn

算法学习——单链表快排

/**  * 以p为轴对start-end间的节点进行快排(包括start && 不包括end):  * 思路:  * 1.将头节点作为轴节点start,从start.next开始遍历,如果节点小于轴start的值,将该节点插入到轴节点后面:  * 2.将轴节点插入合适位置,即找到最后一个小于轴的节点,将该节点与轴节点值互换,此时就链表分为两部分,小于轴节点和大于轴节点:  * 3.递归的遍历2中两部分节点.  *   * @param p  * @param start  * @para

【数据结构】之散列链表(Java语言描述)

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<

单链表逆置

重写单链表逆置,熟能生巧- #include <iostream> #include <cstdlib> using namespace std; typedef struct List{ int num; struct List *next; }ListNode,*pListNode; void display(ListNode *pHead) { while(pHead) { cout<<pHead->num<<"--"; pH

java-------单链表

单链表: * 1.链表可以是一种有序或无序的列表 * 2.链表的内容通常存储在内存中分散的为止 * 3.链表由节点组成,每一个节点具有相同的结构 * 4.节点分为数据域和链域,数据域存放节点内容,链域存放下一个节点的指针 package myLinkList; public class MyLinkedList<T> { /** *Node:节点对象 * 包括数据域data和链域next(指向下一个节点对象) */ class Node { private T data; private No