#include <bits/stdc++.h>
#define MAXNUM 100000
using namespace std;
typedef int DataType;//此处可改变数据类型
struct Node;
typedef struct Node * PNode;//结点指针
struct Node{
DataType info;
PNode link;
};
typedef struct Node * LinkList;//单链表指针类型
LinkList createNullList_link();//创建空链表
int isNullList_link(LinkList llist);//判断单链表是否为空
PNode locate_link(LinkList llist, DataType x);//在单链表中求某元素的存储位置
int insertPost_link(LinkList llist, PNode p, DataType x);//单链表的插入
void insertFromHead_link(LinkList llist, DataType x);//从头部插入元素
PNode locatePre_link(LinkList llist, PNode p);//在单链表中求p所指结点的前驱结点
int deleteV_link(LinkList llist, DataType x);//单链表的删除
int deleteP_link(LinkList llist, PNode p);//删除p所指的结点
void inversion_link(LinkList llist);//置逆表中元素
void removeDuplicates_link(LinkList llist);//删除相同数据域结点
int show_link(LinkList llist);//打印链表内容
int main(){
//测试
cout << "创建一个空的单链表" << endl;
LinkList myList = createNullList_link();
if(isNullList_link(myList))
cout << "此时表为空" << endl;
else cout << "表不为空" << endl;
cout << "输入想要插入元素个数" << endl;
int m;
cin >> m;
cout << "开始从头部插入元素" << endl;
int insertX;
for(int i = 0;i < m;i ++){
cin >> insertX;
insertFromHead_link(myList, insertX);
}
if(isNullList_link(myList))
cout << "此时表为空" << endl;
else cout << "表不为空" << endl;
cout << "输出所有元素" << endl;
show_link(myList);
cout << "置逆顺序表" << endl;
inversion_link(myList);
cout << "输出所有元素" << endl;
show_link(myList);
cout << "删除表中重复元素" << endl;
removeDuplicates_link(myList);
cout << "输出所有元素" << endl;
show_link(myList);
system("pause");
return 0;
}
LinkList createNullList_link(){//创建空链表
LinkList llist = (LinkList)malloc(sizeof(struct Node)) ;//申请表头结点空间
if(llist != NULL)//创建失败
llist->link = NULL;
else
printf("Out of space!\n");
return llist;
}
int isNullList_link(LinkList llist){//判断单链表是否为空
return(llist->link == NULL);
}
PNode locate_link(LinkList llist, DataType x){//在单链表中求某元素的存储位置
//在带有头结点的单链表llist中找到一个值为x的结点存储位置
PNode p;
if(llist == NULL)
return NULL;
p = llist->link;
while(p != NULL && p->info != x)
p = p->link;
}
int insertPost_link(LinkList llist, PNode p, DataType x){//单链表的插入
//在带头结点的单链表llist中,p所指结点后面插入元素
PNode q = (PNode)malloc(sizeof(struct Node));//申请新结点
if(q == NULL){
printf("Out of space!!!\n");
return 0;
}
else{
q->info = x;
q->link = p->link;
p->link = q;
return 1;
}
}
PNode locatePre_link(LinkList llist, PNode p){//在单链表中求p所指结点的前驱结点
PNode p1;
if(llist == NULL)
return NULL;
p1 = llist;
while(p1 != NULL && p1->link != p)
p1 = p1->link;
return p1;
}
int deleteV_link(LinkList llist, DataType x){//单链表的删除
//在带有头结点的单链表llist中删除第一个值为x的结点
PNode p, q;
p = llist;
if(p == NULL)
return 0;
while(p->link != NULL && p->link->info != x)
p = p->link;//找值为x的结点的前驱结点的存储位置
if(p->link == NULL){//没找的值为x的结点
printf("Not exist!\n");
return 0;
}
else{
q = p->link;//找到值为x的结点
p->link = q->link;//删除该结点
free(q);
return 1;
}
}
int deleteP_link(LinkList llist, PNode p){//删除p所指的结点
if(llist == NULL)
return 0;
else{
PNode temproraryP = locatePre_link(llist, p);//找到前驱结点
temproraryP->link = p->link;
free(p);//释放结点
return 1;
}
}
void inversion_link(LinkList llist){//置逆表中元素
if(llist == NULL)
return;
else{
PNode p, q;
p = llist->link;
llist->link = NULL;
while(p){
q = p;
p = p->link;
q->link = llist->link;
llist->link = q;
}
}
}
void removeDuplicates_link(LinkList llist){//删除相同数据域结点
int record[MAXNUM], count = 1, flag = 0;
PNode p = llist->link, q = p->link;
if(p == NULL || q == NULL)
return ;
record[0] = p->info;
while(q != NULL){
flag = 0;
for(int i = 0;i < count;i ++){
if(q->info == record[i]){
flag = 1;
p->link = q->link;
free(q);
q = p->link;
break;
}
}
if(!flag){
record[count] = q->info;
count ++;
p = p->link;
q = q->link;
}
}
}
void insertFromHead_link(LinkList llist, DataType x){//从头部插入元素
PNode q = (PNode)malloc(sizeof(Node));
q->link = llist->link;
llist->link = q;
q->info = x;
}
int show_link(LinkList llist){//打印链表内容
if(llist == NULL)
return 0;
else{
PNode p = llist->link;
while(p != NULL){
printf("%d ", p->info);
p = p->link;
}
printf("\n");
return 1;
}
}