单链表的操作

ListNode.h
#include<malloc.h>
#include<assert.h>
typedef int DataType;
typedef struct ListNode
{
    struct ListNode* _next;
	DataType _data;
}ListNode;
ListNode* BuyNode(DataType x)//创建一个结点
{
    ListNode* tmp=(ListNode*)malloc(sizeof(ListNode));
	tmp->_data =x;
	tmp->_next=NULL;
	return tmp;
}
void PrintList(ListNode* pHead)//打印
{
   ListNode* p=pHead;
   while(p != NULL)
   {
      printf(" %d -> ",p->_data );
	  p=p->_next ;
   }
   printf("NULL");
   printf("\n");
}
void PushFront(ListNode*& pHead,DataType x)//头插
{
   ListNode* tmp=NULL;
   if(pHead == NULL)
   {
      pHead=BuyNode(x);
   }
   else
   {
      tmp=BuyNode(x);
	  tmp->_next =pHead;
	  pHead=tmp;
   }
}
void PopFront(ListNode*& pHead)//头删
{
    if(pHead)
	{
	   ListNode* del=pHead;
	   pHead=pHead->_next ;
	   free(del);
	}
}
void PushBack(ListNode* pHead,DataType x)//尾插
{
   if(pHead==NULL)
   {
      pHead=BuyNode(x);
   }
   else
   {
       ListNode* cur=pHead;
	   while(cur->_next )
	   {
	      cur=cur->_next ;
	   }
	   cur->_next =BuyNode(x);
   }
}
void PopBack(ListNode*& pHead)//尾删
{
    if(pHead==NULL)
	{
	   return;
	}
	else if(pHead->_next==NULL)
	{
	   pHead=NULL;
	   free(pHead);
	}
	else
	{
	   ListNode* cur=pHead,*prev=pHead;
	   while(cur->_next )
	   {
	      prev=cur;
		  cur=cur->_next ;
	   }
	   prev->_next =NULL;
	   free(cur);
	}
}
ListNode* Find(ListNode* pHead,DataType x)//查找
{
   ListNode* cur=pHead;
   while(cur)
   {
      if(cur->_data ==x)
	  {
	      return cur;
	  }
	  cur=cur->_next ;
   }
   return NULL;
}
void Insert(ListNode * pos,DataType x)//插入
{
    assert(pos);
	ListNode* tmp=BuyNode(x);
	tmp->_next =pos->_next ;
	pos->_next =tmp;
}
void Erase(ListNode* &pHead,ListNode* pos)//删
{
    if(pHead==pos)
	{
	   pHead=pHead->_next ;
	   free(pos);
	}
	else
	{
	   ListNode* cur=pHead;
	   while(cur->_next !=pos)
	   {
	      cur=cur->_next ;
	   }
	   cur->_next =pos->_next ;
	   free(pos);
	}
}
ListNode* FindMiddleListNode(ListNode* pHead)//查找中间节点
	  
{  
    if(pHead == NULL ||pHead->_next  == NULL)  
    {  
        return pHead;  
    }  
    ListNode *p1 = pHead;  
	ListNode *p2 = pHead;
    while((p2->_next  != NULL) && (p2->_next ->_next  != NULL ))  
    {  
        p2 = p2->_next->_next;  
        p1 = p1->_next;  
    }  
    return p1;  
}  
 
void Delete_List(ListNode *cur)//删除非尾节点
{  
    assert(cur);  
    ListNode* next = cur->_next;  
    if(next != NULL)
	{  
        cur->_next = next->_next;  
        cur->_data = next->_data;  
    }  
}  
test.cpp
#include<stdio.h>
#include<stdlib.h>
#include"ListNode.h"
void test1()//PushFront(s,3);//PopFront(s);//PushBack(s,3);//PopBack(s);
{
   ListNode* s=NULL;
   PushFront(s,1);
   PushFront(s,2);
   PushFront(s,3);//头插
   PopFront(s);//头删
   PushBack(s,3);//尾插
   PopBack(s);//尾删
   PrintList(s);
}
void test2()//Find(s,1)//Inser//Erase;
{
   ListNode* s=NULL;
   Insert(s,2);//插入
   Find(s,1);//查找
   Erase(s,s);
   PrintList(s);
}
void test3()//查找中间节点,删除非尾节点
{
   ListNode* s=NULL;
   PushFront(s,1);
   PushFront(s,2);
   PushFront(s,3);
   PushFront(s,4);
   PushFront(s,5);
   PrintList(s);
   ListNode* ret=FindMiddleListNode(s);//查找中间节点
   PrintList(ret);
   Delete_List(s);//删除非尾节点
   PrintList(s);
}
int main()
{
	//test1();
	//test2();
	test3();
	system("pause");
   return 0;
}
时间: 2024-10-22 00:26:45

单链表的操作的相关文章

java数据结构:单链表常见操作代码实现

一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashMap等集合的底层结构都是链表结构.链表以结点作为存储单元,这些存储单元可以是不连续的.每个结点由两部分组成:存储的数值+前序结点和后序结点的指针.即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作. 单链表结构: Java中单链表采用No

基于单链表的操作

单链表 功能设计 1从首元结点开始输出数据域即p->data直到p->next=NULL.typedef struct Node 定义一个链式存储的单链表Node *为结构体指针类型例如对于单链表Lp=L-〉next通过p->data 访问该元素的数据值. 2creatlist(linklist *H) 从空表开始每次读入数据生成新结点将读入的数据存放到新结点的数据域中然后将新结点插入到当前链表的表头结点之后直至读入结束位置为止. 3Leng(linklist *H ) 在单链表中整个链

单链表的操作和指针函数基础

/* ============================================================================ Name : TestLinkedList.c Author : lf Version : Copyright : Your copyright notice Description : 1 单链表的增删改查等操作 2 指针函数的使用.如示例中的:void (*visit)(link) ==========================

线性单链表的操作

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define INFEASIBLE -1 #define OVERFLOW -2 /* #define ElemType int #define Status int */ typedef int ElemType; typedef int Status; /* #define LNo

数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). 输入 第一行输入元素个数n: 第二行输入n个整数. 输出 第一行输出初始链表元素个数: 第二行输出按照逆位序所建立的初始链表: 第三行输出删除重复元素后的单链表元素个数: 第四行输出删除重复元素后的单链表. 示例输入 10 21 30 14 55 32 63

单链表插入操作

URL:http://jpkc.onlinesjtu.com/CourseShare/Courses/ResourceModule/PreReading.aspx?courseid=701018&nodid=238&chapterid=238&preid=16 单链表的插入操作 1)已知线性链表head,在p指针所指向的结点后插入一个元素x. 在一个结点后插入数据元素时,操作较为简单,不用查找便可直接插入. 操作过程如下图所示: 相关的语句如下: { s=(slnodetype*)

合并两个有序单链表的操作

/*以合并两个2个长度均为n的递增单链表为例 演示连个单链表的合并操作*/ #include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<stdio.h>#include<queue>#include<math.h>#define INF 0x3f3f3f3f#define MAX 1000005#define Temp 100

数据结构——单链表及其操作

1 #include<iostream> 2 #include<string> 3 #include<stdlib.h> 4 5 using namespace std; 6 7 typedef int ElemType; 8 typedef int Status; 9 #define OK 1 10 #define ERROR 0 11 12 13 //单链表的存储结构 14 typedef struct LNode 15 { 16 ElemType data; //

【复习数据结构】单链表的操作

#include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct LNode{ //定义单链表结点类型 ElemType data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; /** * 头插法初始化链表 **/ LinkList CreateListhead(void){ char ch; LinkList L; //初始化链表 LNo

java单链表常用操作

总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K个节点] [查找链表中间节点] [判断链表是否有环] [从尾到头打印单链表-递归] [从尾到头打印单链表-栈] [由小到大合并有序单链表-循环] [由小到大合并有序单链表-递归] 通常在java中这样定义单链表结构 <span style="font-family:Microsoft YaHe