`
473687880
  • 浏览: 482665 次
文章分类
社区版块
存档分类
最新评论

基本算法——线性表的链式表示

 
阅读更多

以下为操作链表的算法,该链表为动态单链表。
链表以头指针为索引,头指针指向头节点,头节点指向首节点,以此类推,直到尾节点。
头节点中不存放数据,只存放指向首节点的指针,
设置头节点的目的是为了方便对链表的操作,如果不设置头节点,而是直接由头指针指向首节点,
这样在对头指针后的节点进行插入删除操作时就会与其他节点进行该操作时有所不同,便要作为一种特殊情况来分析

操作系统:ubuntu

编译软件:gcc<wbr></wbr>

结果截图:

源代码:

#include
#include
#include

typedef struct Node
{
 int data;
 struct Node *pNext;
}NODE,*PNODE;

PNODE create_list();      
void traverse_list(PNODE);
bool is_empty(PNODE);    
int length_list(PNODE);
void sort_list(PNODE);   
bool insert_list(PNODE,int,int);
bool delete_list(PNODE,int,int *);
void clear_list(PNODE);

int main(void)
{
 int len;
 int data_del;
 PNODE pHead = NULL;

 //创建链表并遍历输出
  pHead = create_list();
 traverse_list(pHead);

 //求链表长度,并输出
 len = length_list(pHead);
 if(!is_empty(pHead))
  printf("the length of the list is:%d\n",len);
 
 //向链表中插入数据,并重新遍历输出
 if(insert_list(pHead,3,78))
  printf("insert succeed,");
 else
  printf("insert failed,");
 traverse_list(pHead);

 //从链表中删除数据,并重新遍历输出
 if(delete_list(pHead,3,&data_del))
  {
    printf("delete succeed,the deleted data is:%d\n",data_del);
  }
 else
  printf("delete failed,");
 traverse_list(pHead);
 
 //对链表排序,重新遍历输出
 sort_list(pHead);
 printf("After sorted,");
 traverse_list(pHead); 
 
 //清空链表,遍历输出(无数据输出)
 clear_list(pHead);
 printf("After cleared,");
 traverse_list(pHead); 
 return 0;
}

//子函数:创建一个链表,并返回头指针
PNODE create_list()
{
 int val;
 PNODE pHead =(PNODE)malloc(sizeof(NODE));
 PNODE pCurrent = pHead;
 pCurrent->pNext = NULL;
 if(NULL == pHead)
 {
  printf("pHead malloc failed!");
  exit(-1);
 }
 printf("Input first data(q to quit):");
 while(scanf("%d",&val)==1)
 {
  PNODE pNew = (PNODE)malloc(sizeof(NODE));
  if(NULL == pNew)
  {
   printf("pNew malloc failed!");
   exit(-1);
  }
  pNew->data = val;
  pCurrent->pNext = pNew;
  pNew->pNext = NULL;
  pCurrent = pNew;
  printf("Input next data(q to quit):");
 } 
 return pHead; 
}

//子函数:遍历链表

void traverse_list(PNODE pHead)
{
 PNODE pCurrent = pHead->pNext;
 printf("now dataes in the list are:\n");
 while(pCurrent != NULL)
 { 
  printf("%d ",pCurrent->data);
  pCurrent = pCurrent->pNext;
 }
 printf("\n");
 return ;
} 
//子函数:判断链表是否为空
bool is_empty(PNODE pNode)
{
 if(NULL == pNode->pNext)
  return true;
 else
  return false;
}

//子函数:求链表长度(不计入头结点)
int length_list(PNODE pNode)
{
 int count = 0;
 PNODE pCurrent = pNode->pNext;
 while(pCurrent != NULL)
 {
  count++;
  pCurrent = pCurrent->pNext;  
 }

 return count;
}

//子函数:冒泡法对链表排序
void sort_list(PNODE pHead)
{
 PNODE p,q;
 int temp;
 for(p=pHead->pNext;p!=NULL;p=p->pNext)
     for(q=p->pNext;q!=NULL;q=q->pNext)
  {
     if(p->data>q->data)
               {
    temp = p->data;
    p->data = q->data;
    q->data = temp;
        }
  }

 return ;
}

//子函数:在第pos个节点的后面插入一个新的节点,该节点中的数据为val
bool insert_list(PNODE pHead,int pos,int val)
{
 int i = 0;
 PNODE p = pHead;

 //i为0时,p指向第0个节点(这里指没有实际数据的头节点,不计入链表节点总数),
 //i为1时,p指向第1个节点,i为几,p就指向第几个节点
 while(p!=NULL && i
 {
    p = p->pNext;
    i++;
 }

 //当pos的值大于链表长度时,便会出现这种情况
 if(i>pos || p==NULL)
    return false;

 PNODE pNew = (PNODE)malloc(sizeof(NODE));
 if(NULL == pNew)
 {
    printf("pNew malloc failed!");
    exit(-1);
 }
 pNew->data = val;
 pNew->pNext = p->pNext;
 p->pNext = pNew;

 return true;
}

//子函数:删除第pos个节点,并将删除的数据保存在pData指针所指向的位置
bool delete_list(PNODE pHead,int pos,int *pData)
{
 int i = 0;
 PNODE p = pHead;

 //p最终指向第pos个节点前面的节点
 //如果下面两句分别改为while(p!=NULL && ipos || p==NULL),则p最终指向第pos个节点,
 //这样因为得不到第pos个节点前面的那个节点,因此无法将pos前后两个节点连结起来
 while(p->pNext!=NULL && i
 {
    p = p->pNext;
    i++;
 }

 //当pos的值大于链表长度时,便会出现这种情况
 if(i>pos-1 || p->pNext==NULL)
    return false;

 PNODE q = p->pNext;
 *pData = q->data;
 p->pNext = p->pNext->pNext;
 free(q);
 q = NULL;
 return true;
}

//子函数:清空链表,即使链表只剩下头节点(头节点中没有数据)
void clear_list(PNODE pHead)
{
 PNODE p = pHead->pNext;
 PNODE r = NULL;
 while(p != NULL)
 {
    r = p->pNext;
    free(p);
    p = r;
 }
 pHead->pNext = NULL;
 return ;
}


分享到:
评论

相关推荐

    数据结构辅导讲义

    3. 单链表——线性表的链式存储结构之一 10 4. 循环链表 15 5. 双向循环链表 15 6. 顺序表与单链表的比较 16 二、 习题 16 第3章 栈和队列 17 一、 基础知识和算法 17 1. 栈 17 2. 链栈 17 3. 顺序栈 18 4. 队列 19 ...

    一个链表——链式存储

    编写一个数组,利用链式 不是顺序的 实现元素 排序 查找 插入等!

    数据结构课程设计C++

    以数据逻辑结构之一——线性表应用最广泛。因此,要熟练掌握线性表的基本操作(建立、插入、删除、遍历等)在顺序存储和链式存储上的实现。通过实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的...

    数据结构讲义(严蔚敏版)(含算法源码).rar

    3. 单链表——线性表的链式存储结构之一 10 4. 循环链表 15 5. 双向循环链表 15 6. 顺序表与单链表的比较 16 二、 习题 16 第3章 栈和队列 17 一、 基础知识和算法 17 1. 栈 17 2. 链栈 17 3. 顺序栈 18 4. 队列 19 ...

    线性表的链式存储——链表(带源码)

    NULL 博文链接:https://canlynet.iteye.com/blog/605687

    严蔚敏 数据结构(C语言版) 代码 23490 书中算法

    2.3 线性表的链式表示和实现 24 2.3.1 单链表的定义和表示 24 2.3.2 单链表基本操作的实现 26 2.3.3 循环链表 31 2.3.4 双向链表 32 2.4 线性表的应用 34 2.4.1 一般线性表的合并 34 2.4.2 有序表的...

    数据结构实验——单链表

    实验二 单链表实验 一、实验目的 1、掌握用Visual C++6.0上机调试单链表的基本方法 2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现 ...[基本要求]用链式存储结构实现存储

    算法与数据结构复习题型

    数据结构复习试题——线性表 一、 选择题 1.下列哪一条是顺序存储结构的优点 【 】 A. 插入运算方便 B. 可方便地用于各种逻辑结构的存储表示 C. 存储密度大 D. 删除运算方便 2. 下面关于线性表的叙述中,错误的是哪...

    数据结构实验指导.doc

    掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验预习与准备 1.复习教材相关章节内容。 2.复习C语言中关于结构体与指针的相关内容。 3.认真阅读实验题目,事先写好程序。 三、实验内容和步骤 实验...

    线性表实验报告.doc

    掌握线性表在链式存储结构——单链表中的各种基本操作。 6、认真阅读和掌握实验的程序。 7、上机运行本程序。 8、保存和打印出程序的运行结果,并结合程序进行分析。 二、 实验的主要内容 题目: 请编制C语言,利用...

    华南 数据结构上机实验代码 完整代码

    链式线性表的基本操作 合并链表 线性链表逆置 顺序栈的基本操作 循环队列的基本操作 栈的应用——进制转换 括号匹配检验 行编辑程序 表达式求值 队列的应用——银行客户平均等待时间 计算next值 KMP算法 ...

    数据结构、算法与应用:C++语言描述(原书第2版)第二部分

    第6章 线性表——链式描述 6.1 单向链表 6.1.1 描述 6.1.2 结构chainNode 6.1.3 类chain 6.1.4 抽象数据类型linearList的扩充 6.1.5 类extendedChain 6.1.6 性能测量 6.2 循环链表和头节点 6.3 双向链表 6.4 链表...

    数据结构实验(6).doc

    " " " "实验预习(含实验原理及设计过程等) " "实验原理:线性表的链式结构及各种基本操作。 " "算法描述:要求分别写出在带头结点的单链表中第(从1开始计数)个位置之后插入元" "素、创建带头结点的单链表、在...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 3.2 常量与变量 33 23.2.1 常量和符号...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 3.2 常量与变量 33 23.2.1 常量和符号...

    软件工程之专题九:数据结构知识

    学习数据结构目的是要熟悉一些最常用的数据结构,明确数据结构内在的逻辑关系,知道它们在计算机中的存储表示,并结合各种典型应用说明它们在进行各种操作时的动态性质及实际的执行算法,进一步提高软件计和编程水平...

    数据结构——用C描述

    数据结构——用C描述答案 习题解答(唐策善版)(其他版本在上面) 第一章 绪论(参考答案) 1.3 (1) O(n) (2) (2) O(n) (3) (3) O(n) (4) (4) O(n1/2) (5) (5) 执行程序段的过程中,x,y值变化如下: 循环次数 x y 0...

    计算机二级公共基础知识

    1. 算法的基本概念 利用计算机算法为计算机解题的过程实际上是在实施某种算法。 (1)算法的基本特征 算法一般具有4个基本特征:可行性、确定性、有穷性、拥有足够的情报。 (2)算法的基本运算和操作 算法的基本...

    ACM程序设计培训教程

     1.1.4 线性表的链式存储…………………………………………………………2  1.1.5 单链表………………………………………………………………………2  1.1.6 单链表的插入操作………………………………………………...

Global site tag (gtag.js) - Google Analytics