线性表的查找和交换

/*
题目源自王道数据结构
如果找到要查找的元素,将要查找的元素前移一位
在顺序表和单链表中实现
说明:
在顺序表中,通过折半查找进行查找,找到待查找元素之后交换位置
在单链表中,通过两种方法进行交换,一种是结点不变,交换结点的值,函数类似于顺序表;另一种是交换结点 
问题:
使用链式结构的顺序结构,在初始化的时候如果录入的元素超出了初始的空间,应该怎样扩大空间并继续保存录入
*/
#include <iostream>
#include <cstdlib>
using namespace std;
const int InitSize = 100; 
typedef int ElemType;
struct SqList{
	ElemType *elem;
	int length;
};
typedef struct LNode {
	ElemType data;
	struct LNode *next;
}*LinkList;
//初始化顺序表 
void InitList1(SqList &l){
	int i = 0;
	char c;
	ElemType e;
	l.elem = (ElemType*)malloc(InitSize*sizeof(ElemType));
	while(cin >> l.elem[i++]){
		c = getchar();
		if(c=='\n')
			break;
	}
	l.length = i;
}
//初始化单链表(尾插法-保持录入元素和保存结点的位置一致) 
void InitList1(LinkList &l) {
	ElemType e;
	char c;
	LinkList r;
	l = (LinkList)malloc(sizeof(LNode));
	r = l;
	while(cin >> e){	//空格隔开,换行结束 
		LinkList s = (LinkList)malloc(sizeof(LNode));
		s->data = e;
		r->next = s;
		r = s;
		
		c = getchar();
		if(c=='\n')
			break;
	}
	r->next = NULL;
}
//顺序表处理:非递归折半查找并移动查找到的元素位置 
int binarySort(SqList &l, ElemType e, int low, int high){
	int mid;
	while(low<=high){
		mid = (low+high)/2;
		if(l.elem[mid]==e){	//找到该元素
			l.elem[mid] = l.elem[mid-1];
			l.elem[mid-1] = e;
			return mid+1;
		}
		else if(l.elem[mid]<e)	//右半边
			low = mid+1;
		else	//左半边
			high = mid-1;
	}
	return -1;
}
//单链表处理:顺序查找 并 交换结点位置 。
int LinkSort(LinkList &l, ElemType e) {
	LinkList p, q, s;
	int i=1;	//记录位置 
	p = l;
	q = p->next;
	s = q->next;
	if(q->data == e)	//第一个元素就是待查找元素,不用交换位置,直接返回位置 
		return 1; 
	while(s){
		if(s->data != e){	//未找到待查找元素 
			p = p->next;
			q = q->next;
			s = s->next; 
			i++;
		}else{	//找到待查找元素 
			p->next = s;
			q->next = s->next;
			s->next = q;
			return i;
		}
	}
	return -1;	//没找到 
}
//打印顺序表元素
void printList(SqList l){
	int i;
	for(i=0; i<l.length; i++)
		cout << l.elem[i] << " "; 
	cout << endl;
}
//打印单链表元素
void printList1(LinkList l) {
	LinkList p  = l->next;
	while(p){
		cout << p->data << " ";
		p = p->next; 
	}
	cout << endl;
}
int main(){
	SqList l;
	LinkList L; 
	ElemType x;
	//顺序表操作 
//	cout << "输入表元素:";
//	InitList(l);
//	cout << "输入要查找的元素:";
//	cin >> x;
//	cout << "初始状态的表:";
//	printList(l);
//	if(binarySort(l, x, 0, l.length-1) != -1){	//找到了
//		cout << "重置后的表:";
//		printList(l);
//	}else{
//		cout << "没有找到该元素。" << endl;
//	}
	
	//单链表操作
	cout << "输入表元素:";
	InitList1(L);
	cout << "输入要查找的元素:";
	cin >> x;
	cout << "初始状态的表:";
	printList1(L);
	if(LinkSort(L, x) != -1){	//找到了
		cout << "重置后的表:  ";
		printList1(L);
	}else{
		cout << "没有找到该元素。" << endl;
	}	
	return 0;
}

程序小白,如果代码中有任何问题,欢迎指出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值