对单链表的一些操作

  1 #include "stdafx.h"
  2 #include<string>
  3 #include<iostream>
  4 #include<stack>
  5 using namespace std;
  6
  7 struct ListNode
  8 {
  9     //结点类型
 10     int m_nValue;
 11     ListNode* m_pNext;
 12 };
 13
 14 void AddToTail(ListNode** pHead,int value)
 15 {
 16     //尾插法
 17     ListNode* pNew = new ListNode();
 18     pNew->m_nValue = value;
 19     pNew->m_pNext = NULL;
 20     if(*pHead==NULL)
 21     {
 22         *pHead = pNew;
 23     }else
 24     {
 25         ListNode *pNode = *pHead;
 26         while(pNode->m_pNext !=NULL)
 27         {
 28             pNode =pNode->m_pNext;
 29         }
 30         pNode ->m_pNext = pNew;
 31     }
 32 }
 33
 34 void AddToHead(ListNode** pHead,int value)
 35 {
 36     //头插法
 37     ListNode *pNew = new ListNode;
 38     pNew->m_nValue = value;
 39     pNew->m_pNext = NULL;
 40
 41     if(*pHead==NULL)
 42     {
 43         *pHead =pNew;
 44     }
 45     else
 46     {
 47         ListNode *Head = *pHead;
 48
 49         pNew->m_pNext = Head;
 50         (*pHead) = pNew;
 51
 52     }
 53 }
 54
 55 void showNode(const ListNode *Head)
 56 {
 57     int count = 0;
 58     while(Head!=NULL)
 59     {
 60         cout<<Head->m_nValue<<"  ";
 61         Head=Head->m_pNext;
 62         count++;
 63     }
 64     cout<<endl<<"元素个数:"<<count<<endl;;
 65
 66 }
 67
 68 void InsertNodeByArray(int *arr,int length,ListNode** Head)
 69 {
 70     //通过数组进行插入元素
 71     for(int i =0;i!=length;++i)
 72     {
 73         AddToTail(Head,arr[i]);
 74     }
 75 }
 76
 77 void RemoveNode(ListNode** Head,int value)
 78 {
 79     //删除元素内容是value的所有结点,注意第一个元素和最后一个元素
 80     if(*Head==NULL)
 81     {
 82         cout<<"Can not Find the value:"<<value<<endl;
 83         return;
 84     }
 85     ListNode *pHead = *Head;
 86     ListNode *pDelete;
 87     if(pHead->m_nValue==value)
 88     {
 89         pDelete = *Head;
 90         (*Head)=pDelete ->m_pNext;
 91         delete pDelete;
 92         pDelete = NULL;
 93         return;
 94     }
 95     else
 96     {
 97         while(pHead->m_pNext!=NULL){
 98             while(pHead->m_pNext!=NULL&&pHead->m_pNext->m_nValue!=value)
 99             {
100                 pHead=pHead->m_pNext;
101             }
102
103             if(pHead->m_pNext!=NULL&&pHead->m_pNext->m_nValue==value)
104             {
105                 cout<<"Find The Node,The value is:"<<value<<endl;
106                 pDelete =pHead->m_pNext;
107                 if(pDelete->m_pNext!=NULL){
108                     pHead->m_pNext=pDelete->m_pNext;
109                     pHead=pHead->m_pNext;
110                     delete pDelete;
111                     pDelete = NULL;
112                 }
113                 else
114                 {
115                     pHead->m_pNext=NULL;
116                     delete pDelete;
117                     pDelete = NULL;
118                     return;
119                 }
120             }
121         }
122     }
123 }
124
125
126 void resverseList(ListNode *Node)
127 {
128     if(Node!=NULL){
129     if(Node->m_pNext!=NULL)
130     {
131         resverseList(Node->m_pNext);
132     }
133     cout<<Node->m_nValue<<"  ";
134     }
135     //递归实现反向遍历链表
136 }
137
138 void resverseList_Stack(ListNode *Node)
139 {
140     //用stack逆向输出.
141     stack<ListNode*> sNode;
142     ListNode *pNode = Node;
143     while(pNode!=NULL)
144     {
145         sNode.push(pNode);
146         pNode=pNode->m_pNext;
147     }
148
149     while(!sNode.empty())
150     {
151         cout<< sNode.top()->m_nValue<<"  ";
152         sNode.pop();
153     }
154     //递归实现反向遍历链表
155 }
156
157
158 int _tmain(int argc, _TCHAR* argv[])
159 {
160     const int len = 3;
161     ListNode *Head=NULL;
162     int a[len]={1,2,3};
163     InsertNodeByArray(a,len,&Head);
164     showNode(Head);
165     RemoveNode(&Head,1);
166     showNode(Head);
167     resverseList(Head);
168     cout<<endl;
169     resverseList_Stack(Head);
170     return 0;
171 }
时间: 2024-11-07 06:44:25

对单链表的一些操作的相关文章

单链表的基础操作

单链表中节点的查找.插入.删除.求单链表长度等操作. 按序号查找结点值 在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL. 按序号查找结点值的算法如下: LNode GetElem(LinkList L,int i){ //本算法取出单链表L(带头结点)中第i个位置的结点指针 int j=1; //计数,初始为1 LNode *p = L->next; //头结点指针赋给p if(i==0) return L; //若i等于0,

单链表的相关操作

#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 *@

数据结构关于单链表的一些操作的源代码

单链表的可以有许多问题,这是我特意整理一下的有关他的相关操作,给出代码,有需要的可以自己调试,重要的就是关于环的一些操作: #include <iostream>#include <cstdio>#include <cstdlib>#include <ctime>using namespace std;typedef int Elemtype;typedef struct Node{ Elemtype data; struct Node *next;}Nod

算法数据结构 单链表的实现+操作 以及和顺序表的对比

顺序表和单链表的优缺点对比: 顺序表的优点,无需为表示表中元素之间的逻辑关系而增加额外的存储空间: 可以快速的存取表中的任意位置的元素. 顺序表的缺点,插入后删除操作需要移动大量元素: 当线性表长度不稳定时,存储空间难确定,容易造成存储空间碎片. 对于单链表 链式存储即元素存储的内存单元可以是不连续,分散的.对于元素间如何来维护他们的关系(即逻辑结构,每个元素的前驱和后继.) 即用到一个指针域来存储他和前驱或是后继直接的关系. 如上面的是一个单链表的指针结构,即每个元素中存储了他的后继元素的内存

链表-单链表的各种操作

单链表的结构体的定义 typedef struct LNode { ElemType data; struct LNode *next; }LinkList; 基本的单链表的操作 /* 功能:构建一个空的带头节点的单链表*/ Status InitList (struct LNode **L) { (*L) = (struct LNode *)malloc(sizeof(struct LNode)); //产生头节点 if(!*L) exit(OVERFLOW); (*L)->next = NU

详谈单链表的有关操作集锦~

1.单链表    在 Java 中没有显式的指针类型,然而实际上对象的访问就是使用指针来实现的,即在Java 中是使用对象的引用来替代指针的.因此在使用 Java 实现该结点结构时,一个结点本身就是一个对象.结点的数据域 data 可以使用一个 Object 类型的对象来实现,用于存储任何类型的数据元素,并通过对象的引用指向该元素:而指针域 next 可以通过节点对象的引 用来实现.      单链表结点结构是结点的一种最简单的形式,除此之外还有其他不同的结点结构,但是这些结点结构都有一个数据域

单链表的常用操作(二)

接上一篇单链表的基本操作,我又整理了一些链表常考的题目,并且不断更新中... 1.查找链表中倒数第k个节点以及删除倒数第k个节点 //给两个指针p和q,让其中一个指针p领先q指针k步, //然后再同时移动p和q指针,当领先的指针p先到达链表尾部时,后面的指针q所指向的节点恰好为倒数第k个节点. Node* GetKthNode(int k) { Node *p=head; Node *q=head; while(k>1&&p->next!=NULL) { p=p->nex

带头节点的单链表的插入操作

1.偶然看到了十字链表的应用,想到之前在<数据结构与算法分析>的链表一章中,需要用多重表实现一个简单的查询功能.功能需求如下: “已知 学生 和 学校课程 总数 分别为 40000 和 2500,现在需要得到两份报告,一份显示每门课成注册的所有学生信息, 一份显示每个学生注册了哪些课程.” 显然可以用一个 40000 * 2500 个元素的二维数组来解决,但是每个学生选课数目很少,因此会浪费很多空间.因此选择十字链表来实现. 既然是链表,那么肯定要有插入操作,于是便有了本文.算是对功能实现前的

单链表逆序操作

//逆序操作//算法1:从第二个节点开始,记录它的下一个节点,然后依次挪到第一个节点之前成为新表头int inverse_node(struct node pH){struct node p = pH; //头结点struct node pPrev = NULL; //记录前一个节点struct node pBack = NULL; //记录下一个节点地址struct node *pFirstNode = p->pNext; //记录第一个节点 //节点只有1个或者无有效节点时,返回原来的链表,

单链表的各种操作

#include <stdio.h> #include <stdlib.h> typedef struct { char data; struct Node * next; }Node, *LinkList; void meau(); LinkList CreateFromHead(); void ListLength(LinkList L); void printLink(LinkList L); LinkList inversePermutation(LinkList L);