链表的定义及其基本运算
来源:互联网 发布:mysql日期建立索引 编辑:程序博客网 时间:2024/05/16 12:40
由于链表的描述比较复杂,故此处仅贴出代码,并附上本人遇到的部分问题,以供学习参考之用。
#include<iostream>using namespace std;typedef struct tagNode{ int data; tagNode* next;}node;/*该结点可看成是**存放了数值域data和指针域next的递归定义的指针**原来的结点声明报错。出错原因为:typedef相当于为struct结构声明了一个新的名字,如:typedef int INT;则可令INT = 4;而此代码并未给新的名字“赋值”。最让人无法忍受的事情是,此代码系本人教材源码,坑人!在新的声明中,我们给struct赋予了新的名字tagNode,并用tagNode定义了结点node。(注:此说明是个人理解,仅作参考)typedef struct{ int data; node* next;}node;*/class list{public: list(); ~list(); int length(); int get_element(int i,int& x); node* locate(int x); void insert(int i,int x); int delete_element(int i); node* get_head(){return head;} void create_R(); void PrintList();private: int count; node* head; //声明头结点};list::list(){ head = new node; //为头结点开辟空间 head -> next = NULL; //将其指针置为空指针 count = 0;}int list::length() //另一简单的做法为:return count;{ int i = 0; node* p = head -> next; while(p != NULL){ p = p -> next; i ++; } return i;}int list::get_element(int i,int& x) //取得i号元素的值,并放入x中{ node* p; //声明新结点p p = head -> next; int j = 1; while(p != NULL&&j != i){ p = p -> next; j ++; } if(p == NULL) return -1; x = p -> data; return 0;}node* list::locate(int x) //将指针作为返回类型{ node* p; p = head -> next; while(p){ if(p -> data == x) return p; else p = p -> next; } return NULL;}void list::insert(int i,int x) //调用该函数无法运行,怀疑是内存分配问题,但不知道如何修改{ node* p; /*head = new head; 该语句导致了一个意想不到的错误,因为head在构造函数中已经被初始化了, 在这里重新分配内存,会报错。*/ p = head; int j = 0; while(p || j != i - 1){ p = p -> next; j ++; } if(i < 1 || i > count + 1) return ; node* s = new node; s -> data = x; s -> next = p -> next; p -> next = s; count ++;}int list::delete_element(int i)//与上一函数问题相同{ node* p; p = head; int j = 0; while(p || j != i){ p = p -> next; j ++; } if(i < 1 || i > count + 1) return -1; node* u = new node; u = p -> next; p -> next = u -> next; delete u; count --; return 0;}list::~list() //释放指针{ node* p; p = head -> next; while(p) delete p;}void list::create_R() //尾插法建立链表{ node *s,* rear = NULL; int x; cin>>x; rear = head; int flag = 0; while(x != -1){ //以-1作为结束标志 count ++; s = new node; if(flag == 0){ /*一开始没有该if语句,亦出现insert函数的错误,是因为head没有指向s, 即该链表没有头结点。解决方法为:设置一标志flag,第一次循环时就执 下来的循环永远都不会再执行它。这种思想很重要,要mark一下*/ head -> next = s; flag = 1; } s -> data = x; rear -> next = s; rear = s; rear -> next = NULL; cin>>x; }}void list::PrintList(){ node* p; p = head -> next; while(p != NULL){ cout<<p -> data<<" "; p = p -> next; } cout<<endl;}int main(){ int x = 3; int y; list L; node* s = NULL; L.create_R(); cout<<"链表的元素为:\n"; L.PrintList(); cout<<"取出第3号元素,并将其值存入y,y = "; L.get_element(x,y); cout<<y<<endl; cout<<"链表长度为:"; cout<<L.length()<<endl; cout<<"元素x所在的指针地址为:"; cout<<L.locate(x); return 0;}
运行结果如下图所示:
0 0
- 链表的定义及其基本运算
- 栈的定义及其基本运算
- 特殊的线性表-栈的定义及基本运算
- 特殊的线性表-队列的定义及基本运算
- 队列的定义及其基本操作
- 栈的链式存储及其基本运算
- 队列的链式存储及其基本运算
- 队列的定义及基本运算
- 队列的定义及基本运算
- 栈的定义以及基本运算
- 2.1线性表及其基本运算
- 基本类型及其运算
- 矩阵及其基本运算
- 栈的链式存储结构及其基本运算的实现
- 队列的顺序存储结构及其基本运算的实现
- 栈的链式存储结构及其基本运算的实现
- 二叉树的基本运算及其实现的例程
- 栈的链式存储结构及其基本运算的实现
- 在ubuntu12.04中添加用户
- 多线程框架
- Android getWidth和getMeasuredWidth的正解
- 关于 tomcat 集群中 session 共享的三种方法
- bfs实现问题---数学
- 链表的定义及其基本运算
- mongodb中的ObjectId类型主键
- errno: 150
- Mybatis中查询条件和返回的结果Map封装
- JNI JNA JNATIVE
- iOS HTTP请求与解析
- Fragment的优化1
- Linux下复制粘贴快捷键
- 细化程序 实测能用