【数据结构】单链表

#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;
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随处可见的打字员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值