发布网友 发布时间:2022-04-06 06:48
共3个回答
热心网友 时间:2022-04-06 08:18
#include <iostream>
using namespace std;
template <typename T>
class LinkList
{
friend ostream& operator << (ostream&, const LinkList<T>&);
struct Node
{
T data;
Node* next;
};
public:
LinkList();
LinkList(const LinkList<T>&);
~LinkList();
bool Insert(const T&, int = 1);
bool Delete(int = 1);
const LinkList<T>& operator = (const LinkList<T>&);
void Clear()
{
while( Delete() );
count = 0;
}
private:
int count;
Node* head;
};
// 默认构造函数
template <typename T>
LinkList<T>::LinkList()
{
count = 0;
head = new Node;
head->next = NULL;
}
// 拷贝构造函数
template <typename T>
LinkList<T>::LinkList(const LinkList<T>& list)
{
count = 0;
head = new Node;
head->next = NULL;
Node* templ = head;
Node* tempr = list.head->next;
while(tempr != NULL)
{
templ->next = new Node;
templ = templ->next;
templ->data = tempr->data;
tempr = tempr->next;
++count;
}
templ->next = NULL;
}
// 析构函数
template <typename T>
LinkList<T>::~LinkList()
{
Clear();
delete head;
}
// 插入函数,形参index代表将元素插入到始于1的编号上
template <typename T>
bool LinkList<T>::Insert(const T& data, int index)
{
if( (index<1) || (index>count+1) )
return false;
Node* current = head;
while( --index )
current = current->next;
Node* temp = current->next;
current->next = new Node;
current->next->data = data;
current->next->next = temp;
++count;
return true;
}
// 删除函数,形参index代表删除始于对应编号的元素
template <typename T>
bool LinkList<T>::Delete(int index)
{
if( (index<1) || (index>count) )
return false;
Node* current = head;
while( --index )
current = current->next;
Node* temp = current->next;
current->next = temp->next;
delete temp;
--count;
return true;
}
// 赋值运算符的重载
template <typename T>
const LinkList<T>& LinkList<T>::operator = (const LinkList<T>& list)
{
if(this == &list)
return *this;
Clear();
Node* templ = head;
Node* tempr = list.head->next;
while(tempr != NULL)
{
templ->next = new Node;
templ = templ->next;
templ->data = tempr->data;
tempr = tempr->next;
++count;
}
templ->next = NULL;
return *this;
}
// 以友元形式给出的流输出操作符重载
template <typename T>
ostream& operator << (ostream& output, const LinkList<T>& list)
{
LinkList<T>::Node* current = list.head->next;
while(current != NULL)
{
output<<current->data;
current = current->next;
}
return output;
}
int main()
{
LinkList<char> list1;
list1.Insert('a', 1); // 测试插入
list1.Insert('b', 2);
list1.Insert('c', 3);
list1.Insert('d', 4);
list1.Insert('#'); // 测试在头部插入
list1.Insert('?', 10); // 测试超出范围的非法插入
cout<<"list1\t"<<list1<<endl; // 测试输出
LinkList<char> list2(list1); // 测试拷贝构造函数
cout<<"list2\t"<<list2<<endl;
LinkList<char> list3;
list3 = list1; // 测试赋值运算符
cout<<"list3\t"<<list3<<endl;
list1.Delete(3); // 测试删除
list2.Delete(); // 测试在头部删除
list3.Delete(10); // 测试超出范围的非法删除
cout<<'\n';
cout<<"list1\t"<<list1<<endl;
cout<<"list2\t"<<list2<<endl;
cout<<"list3\t"<<list3<<endl;
list1.Clear(); // 测试删除所有节点
cout<<"\nlist1\t"<<list1<<endl;
return 0;
}
不知道你说的4 创建链表(可选)是什么意思,所以没有实现
(是由LinkList类自己完成链表对象的创建?)
此外,我的实现使用了模板,如果你不需要模板,把对应的模板标识删掉,换上你自己的数据类型就可以了。
热心网友 时间:2022-04-06 09:36
这是我写的一个,不太好,对初学者应该是有互助作用吧
#include<iostream>
using namespace std;
class Link
{
struct Node
{
int data;
Node* next;
}node;
public:
Link(){}
void Create()
{
Node *p,*q;
q=head=(Node*)malloc(sizeof(Node));
head->next=NULL;
char ch;
while((ch=getchar())!='\n'){
ungetc( ch,stdin );
p=(Node*)malloc(sizeof(Node));
scanf("%d",&p->data);
p->next=NULL;
q->next=p;
q=p;
}
}
void Output()
{
Node*p=head->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
void Search()
{
printf("\n\t\t1.search by position\n\t\t2.serach by value\n");
Node*p=head->next;;
int i;
int x;
scanf("%d",&i);
switch(i){
case 1:
printf("input positon:");
scanf("%d",&x);
for(i=0;i<x-1;i++){
p=p->next;
}
printf("第%d个数是%d\n",x,p->data);break;
case 2:
printf("input value:");
scanf("%d",&x);
i=0;
while(p!=NULL){
if(p->data==x){
printf("值为%d的数在第%d位\n",x,i+1);
}
p=p->next;
i++;
}
break;
default:printf("err!");
}
}
void Insert()
{
printf("请输入待插入的位置和数值\n");
int position,value;
scanf("%d%d",&position,&value);
Node*p=(Node*)malloc(sizeof(Node));
p->data=value;
Node*q=head;
for(int i=0;i<position-1;i++){
q=q->next;
}
p->next=q->next;
q->next=p;
}
void Delete()
{
printf("您想删除第几个数?\n");
int position;
scanf("%d",&position);
Node*p=head->next;
Node*q=head;
for(int i=0;i<position-1;i++){
q=p;
p=p->next;
}
q->next=p->next;
free(p);
}
private:
Node*head;
};
int main()
{
Link L;
L.Create();
//L.Search();
//L.Insert();
L.Delete();
L.Output();
return 0;
}
热心网友 时间:2022-04-06 11:10
只是谁提问的问题啊!给我们老师布置的作业一模一样,一个字都不差!你是不是王老师啊!