#include<iostream>
#include"stdlib.h"
using namespace std;
typedef struct node
{
int data;
struct node *next;
}ListNode;
int dataflag = 0;
int reverseflag = 0;
typedef ListNode * LinkList;
LinkList CreatListR1(LinkList head);
ListNode *LocateNode(LinkList head, int key);
void DeleteList(LinkList head,int key);
void printlist(LinkList head);
void DeleteAll(LinkList *L);
void DeletePioneer(LinkList head, int x);
void DeleteRepeat(LinkList head);
void DeleteUI();
LinkList InvertedSequence(LinkList head2);
void ui();
void main()
{
int num, key, x, choose, dechoose, fichoose;
char ch;
LinkList head, t, head2;
t = (LinkList)malloc( sizeof(ListNode));
while(1)
{
system("cls");
ui();
cin>>choose;
if(choose == 1)
{
head = CreatListR1(head);
printlist(head);
printf("\n");
cout<<"按任意键返回"<<endl;
fflush(stdin);
getchar();
}
else if(choose == 2)
{
system("cls");
DeleteUI();
printlist(head);
cin>>dechoose;
if(dechoose == 1)
{
cout<<"请输入删除的值:";
scanf("%d",&key);
DeleteList(head,key);
printlist(head);
}
else if(dechoose == 2)
{
printlist(head);
cout<<"请输入删除的值:";
scanf("%d",&key);
DeletePioneer(head,key);
printlist(head);
}
else if(dechoose == 3)
{
DeleteRepeat(head);
printlist(head);
}
else if(dechoose == 4)
{
DeleteAll(&head);
}
else
{
}
fflush(stdin);
cout<<"按任意键回到主界面"<<endl;
getchar();
}
else if(choose == 3)
{
printlist(head);
if(dataflag == 1)
{
cout<<"请输入查找的值:";
scanf("%d",&key);
LocateNode(head, key);
}
fflush(stdin);
cout<<"按任意键返回"<<endl;
getchar();
}
else if(choose == 4)
{
printlist(head);
fflush(stdin);
cout<<"按任意键返回"<<endl;
getchar();
}
else if(choose == 5)
{
printlist(head);
head2 = InvertedSequence(head);
reverseflag = 1;
printlist(head2);
reverseflag = 0;
fflush(stdin);
cout<<"按任意键返回"<<endl;
getchar();
}
else
{
return;
}
}
}
void ui()
{
printf(" 欢迎进入单链表操作界面\n");
printf(" 1.插入数据\n");
printf(" 2.删除数据\n");
printf(" 3.查找数据\n");
printf(" 4.显示数据\n");
printf(" 5.逆序显示数据\n");
printf(" 6.退出程序\n");
}
void DeleteUI()
{
printf(" 删除界面\n");
printf(" 1.删除当前节点数据\n");
printf(" 2.删除前驱节点数据\n");
printf(" 3.删除重复节点数据\n");
printf(" 4.删除所有节点数据\n");
printf(" 5.返回主界面\n");
}
LinkList CreatListR1(LinkList head)
{
int n, i;
int x;
LinkList p, q;
head = (LinkList)malloc( sizeof(ListNode));
head->next = NULL;
cout<<"请输入结点数量:";
cin>>n;
cout<<"请输入结点值:";
for(i = 0; i < n; i++)
{
while(1)
{
scanf("%d",&x);
if(i == 0 ||x >= q->data)
break;
else
{
printf("输入错误,请重新输入\n");
}
}
p = (LinkList)malloc( sizeof(ListNode));
p->data = x;
p->next = NULL;
if(head->next == NULL)
head->next = p;
else
q->next = p;
q = p;
}
q->next = NULL;
dataflag = 1;
return head;
}
ListNode *LocateNode(LinkList head, int key)
{
LinkList p;
p = head->next;
while( p != NULL&& p->data != key)
{
p = p->next;
}
if(p != NULL)
{
cout<<"找到了";
cout<<p->data<<endl;
return p;
}
else
{
cout<<"没找到\n";
return NULL;
}
}
void DeleteList(LinkList head,int key)
{
LinkList p, q, t;
p = head->next;
q = head->next;
while( p != NULL&& p->data != key )
{
p = p->next;
q = p;
}
if(q == head->next)
{
head->next = q->next;
free(q);
return;
}
t = head->next;
while(t->next != q)
{
t = t->next;
}
if(p != NULL)
{
t->next = q->next;
}
else
{
cout<<"数据中没有这个值,删除失败"<<endl;
return;
}
free(q);
}
void DeletePioneer(LinkList head, int x)
{
LinkList p, q, t;
p = head->next;
while(p && p->data != x)
{
q = p;
p = p->next;
}
t = head->next;
while(t->next != q)
{
t = t->next;
}
if(p != NULL)
{
t->next = p;
free(q);
}
else
{
printf("链表中无其值\n");
}
}
void DeleteAll(LinkList *L)
{
LinkList p, q;
p = (*L)->next;
while(p)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
dataflag = 0;
printf("所有结点已删除\n");
}
void printlist(LinkList head)
{
LinkList t;
t = head->next;
if(t == NULL)
{
printf("无数据\n");
return;
}
if(reverseflag != 1)
cout<<"\n当前所有数据为:";
else if(reverseflag == 1)
cout<<"\n逆序显示所有数据:";
while(t != NULL)
{
cout<<t->data<<' ';
t = t->next;
}
printf("\n");
}
void DeleteRepeat(LinkList head)
{
LinkList t, k, q;
for(t = head->next;t->next != NULL && t != NULL;)
{
if(t->data == t->next->data)
{
q = t->next;
t->next = q->next;
free(q);
}
else
{
t = t->next;
}
}
}
LinkList InvertedSequence(LinkList head2)
{
LinkList t, p;
int x;
t = head2->next;
head2 = (LinkList)malloc( sizeof(ListNode));
head2->next = NULL;
while(t != NULL)
{
x = t->data;
p = (LinkList)malloc( sizeof(ListNode));
p->data = x;
p->next = head2->next;
head2->next = p;
t = t->next;
}
return head2;
}