描述
- 定义单链表类,创建带头结点的单链表(节点类型为整型数据),要求包含以下成员函数:
- 头插法创建单链表(利用构造函数实现)
- 尾插法创建单链表(重载构造函数实现)
- 链表的遍历
- 按值删除一个节点
- 按位置删除一个节点
- 链表的析构
输入输入一组数据,以尾插法的形式创建单链表(0表示输入结束)(构造第一个链表)
输入一组数据,以头插法的形式创建单链表(0表示输入结束)(构造第二个链表)
输入要删除元素的值(在尾插法创建的链表中进行改操作)
输入要删除元素的位置(在尾插法创建的链表中进行改操作)输出输出尾插法创建链表的结果
输出头插法插法创建链表的结果
输出按值删除之后链表中剩余的元素(若删除的元素不存在,输出Error)
输出按位置删除之后链表中剩余的元素(若删除的元素不存在,输出Error样例输入
1 2 3 4 5 0 1 2 3 4 5 0 2 0
样例输出
1 2 3 4 5 5 4 3 2 1 1 3 4 5 Error
代码:注意输出结果的格式
#include<cstdio> using namespace std; struct Node { int data; Node *next; }; class Linklist { public: Linklist();///构造函数,通过头插法实现 Linklist(int a[],int n);///重载函数,通过尾插法实现 void print(); int delete_x(int x);///按值删除 int delete_i(int i);///按位置删除 ~Linklist(); private: Node*first; }; Linklist::Linklist()///头插法 { int x=0; first=new Node;first->next=NULL; Node *s; while(scanf("%d",&x)) { if(x==0) break; s=new Node; s->data=x; s->next=first->next; first->next=s; } } Linklist::Linklist(int a[],int n)///尾插法 { first=new Node;first->next=NULL; Node*s,*p; p=first; for(int i=1;i<=n;i++) { s=new Node; s->data=a[i]; p->next=s; p=s; } p->next=NULL; } void Linklist::print()///遍历 { Node* p; p=first->next; while(p) { if(p->next==NULL) printf("%d ",p->data); else printf("%d ",p->data); p=p->next; } } int Linklist::delete_x(int x) { Node *p,*q; p=first; while(p->next) { if((p->next)->data==x) { q=p->next; p->next=q->next; delete q; return 1; } p=p->next; } return 0; } int Linklist::delete_i(int i) { Node *p,*q;int j=0; p=first; while(j<i&&p->next) { if(j==i-1) { q=p->next; p->next=q->next; delete q; return 1; } j++; } return 0; } Linklist::~Linklist() { Node *p; while(first) { p=first->next; delete first; first=p; } } int main() { int a[10000],num=0,x; while(scanf("%d",&x)) { if(x==0) break; a[++num]=x; } Linklist wei(a,num); Linklist tou; wei.print(); tou.print(); int temp1,temp2; scanf("%d%d",&temp1,&temp2); if(wei.delete_x(temp1)) { wei.print(); } else { printf("Error "); } if(wei.delete_i(temp2)) { wei.print(); } else { printf("Error "); } return 0; }