单链表求解

it2024-01-04  62

小白请教数据结构单链表问题

大二刚从电气转到计算机,在学习单链表的时候想着撸一遍书上单链表的源码,然后简单测试一下, 但是出现了问题,希望各位大佬能帮我看看

源码如下

类:

template < typename T > struct LinkList // 单链表结点类型(用结构体) { T data; // 存放数据元素 LinkList <T> * next; //指向下一个节点的域 // 注意,这个不是动作,而是一个单纯的指针区域 }; template<typename T> class LinkListClass // 单链表头节点指针 { public: LinkList<T> * head; // 单链表头节点指针 void CreateListF(T a[], int n); //用头插法建立单链表 void CreateListR(T a[], int n); //用尾插法建立单链表 void DisList(); //输出单链表所有的结点值 int ListLength(); // 求单链表中数据节点的个数 bool GetElem(int i, T &e); // 求单链表中某个数据元素值 int LocateElem(T e); // 按元素值查找 bool ListInsert(int i, T e); // 插入数据元素 bool ListDelete(int i); // 删除数据元素 void Sort(); // 将单链表递增排序 };

函数实现:

#include <iostream> #include "Class.h" using namespace std; // 采用头插法建立单链表 template <typename T> void LinkListClass<T>::CreateListF(T a[], int n) { LinkList<T> * s; int i; head->next = NULL; //将头节点的 next //域设置为 NULL for (i = 0; i < n; i++) //建立循环数据结点 { s = new LinkList <T>(); s->data = a[i]; //创建数据结点 *s s->next = head->next; //将*s结点插到开始结点之前,头节点之后 head->next = s; } } //采用尾插法建表 template <typename T> void LinkListClass<T>::CreateListR(T a[], int n) { LinkList<T> *s, *r; int i; r = head; //r始终指向尾结点,开始时指向头结点 for (i = 0; i < n; i++) { s = new LinkList<T>(); s->data = a[i]; // 创建数据结点 *s r->next = s; //将 *s 结点插到 *r 结点之后 r = s; } r->next = NULL; //将尾结点的 next 设置为 NULl } //输出单链表所有的结点值 template<typename T> void LinkListClass<T>::DisList() { LinkList<T> *p; p = head->next; //p 指向开始结点 //p 不为 NULL, *P 结点的 data 域 while(p != NULL) { cout << p->data << " "; p = p->next; //p 移向下一个结点 } cout << endl; } template <typename T> int LinkListClass <T>::ListLength() { int i = 0; LinkList<T> *p; p = head; while(p->next != NULL) { i++; p = p->next; } return i; } //求单链表中某个元素值 template <typename T> bool LinkListClass<T>::GetElem(int i, T &e) { int j = 0; LinkList<T> *p; p = head; while( j < i && p != NULL) { j++; p = p->next; } if (p = NULL) return false; else { e = p->data; return true; } } //按元素值查找 template <typename T> int LinkListClass<T>::LocateElem(T e) { int i = 1; LinkList<T> *p; p = head->next; while(p != NULL && p->data = e) { p = p->next; i++; } if(p == NULL) return 0; else return (i); } //插入数据元素 template <typename T> bool LinkListClass<T>::ListInsert(int i, T e) { int j = 0; LinkList<T> *s, *p; if(i < 1) return false; p = head; //p 指向头结点,j 置为 0(即头结点序号为 0) while(j < i - 1 && p != NULL) { j++; p = p->next; } if(p == NULL) return false; //未找到第 i-1 个结点,返回 false else //找到第 i-1 个结点 *p 插入新节点并放回 true { s = new LinkList<T>(); s->data = e; s->next = p->next; p->next = s; return true; } } //删除数据元素 template <typename T> bool LinkListClass<T>::ListDelete(int i) { int j = 0; LinkList<T> *q, *p; if (i < 1) return false; p = head; //p 指向头结点 while (j < i - 1 && p != NULL) { j++; p = p->next; } if(p == NULL) return false; else { q = p->next; if(q == NULL) return false; p->next = q->next; //从单链表中删除 *q结点 delete *q; return true; } }

测试程序:

#include "函数实现.cpp" int main() { int a[3] = {1, 2, 3}; int x; LinkListClass<int> L1; //声明单链表类型 L1 L1.CreateListF(a, 3); //头插法建立单链表 L1.DisList(); // 输出单链表内容 }

最后输出的结果如下 请问我是哪里出了问题 因为是刚从电气转来,C++ 不是很熟悉, 希望各位大佬赐教

最新回复(0)