/*
题目源自王道数据结构
如果找到要查找的元素,将要查找的元素前移一位
在顺序表和单链表中实现
说明:
在顺序表中,通过折半查找进行查找,找到待查找元素之后交换位置
在单链表中,通过两种方法进行交换,一种是结点不变,交换结点的值,函数类似于顺序表;另一种是交换结点
问题:
使用链式结构的顺序结构,在初始化的时候如果录入的元素超出了初始的空间,应该怎样扩大空间并继续保存录入
*/
#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;
}
程序小白,如果代码中有任何问题,欢迎指出。