void DispList(List l){ int i; for(i=0;i<l.length;i++) printf("%d ",l.data[i]); printf("\n"); } void move(List &l){ int i=0,j=l.length-1; /*while (l.data[i]>=0,i++,l.data[j]<0,j--) if (i<l.length) { swap(&l.data[i],&l.data[j]); } */ for(i=0;i<l.length-1;i++) for(j=0;j<l.length-1-i;j++) if(l.data[j]>l.data[j+1]) swap(&l.data[j],&l.data[j+1]); } int main(){ int i; ElemType e; List l; InitList(l); InsElem(l,-1,1); InsElem(l,9,2); InsElem(l,-2,3); InsElem(l,0,4); InsElem(l,5,5); InsElem(l,-3,6); printf("线性表:");DispList(l); move(l); printf("线性表:");DispList(l); }
时间: 2023-07-15 22:13:41 浏览: 79
这段代码实现了将一个线性表中的正数移动到负数前面的功能,同时还对整个线性表进行了排序。代码中使用了冒泡排序算法,将每一轮最大的元素放到了最后面,最终达到了整个线性表有序的效果。具体分析如下:
1. `DispList` 函数用于输出线性表中的元素。
2. `move` 函数用于将正数移动到负数前面,并对整个线性表进行排序。函数中使用了双指针的方式,i 指向第一个元素,j 指向最后一个元素。当 i 遇到第一个负数时停止移动,j 遇到第一个正数时停止移动,然后交换两个元素的位置,继续移动 i 和 j,直到 i>=j。这种方法对于部分有序的线性表可以提高排序效率。
3. `main` 函数中初始化了一个线性表,然后先输出原始线性表,调用 `move` 函数进行移动和排序,最后再输出移动和排序后的线性表。
需要注意的是,代码中的 `swap` 函数并没有给出具体实现,可以自行编写或使用系统提供的 `swap` 函数。
相关问题
#include<iostream> using namespace std; const int MaxSize=100; template<class T> struct Node{ T data; Node<T> *next; }; template<class T> class SeqList { private: T data[MaxSize]; int length; public: SeqList(); ~SeqList(); int Locate(T x); //查找元素x在表中的位置,成功返回x在表中的位置,否则返回0 void Insert(int i, T x); //在表的i位置插入元素x void Reverse(); //逆序表中数据 void DispList(); }; template<class T> SeqList<T>::SeqList() { length=0; } template<class T> SeqList<T>::~SeqList(){} template <class T> int SeqList<T>::Locate(T x) //查找元素x在表中的位置,成功返回x在表中的位置,否则返回0 { for(int i=0;i<length;i++) { if(data[i]==x) return i; } return 0; } template <class T> void SeqList<T>::Insert(int i, T x) //在表的i位置插入元素x { for(int i=length;i>=i;i--) { data[i]=data[i-1]; } data[i]=x; length++; } template <class T> void SeqList<T>::Reverse() //逆序表中数据 { for(int i=0;i<(length-1)/2;i++) { data[i]=data[length-i]; } } template <class T> void SeqList<T>::DispList() { cout<<"The length:"<<length<<endl; cout<<"The elements:"<<endl; for(int i=0;i<length;i++) { cout<<data[i]<<" "; } cout<<endl; } template<class T> int main () { int n,x,i; SeqList<T> l; cin>>n; while(n!=0) { l.Insert(n); cin>>n; } l.DispList(); cin>>x; if(!l.Located(x)) cout<<"No found"<<endl; else cout<<"Found position:"<<l.Located(x); l.Reverse(); l.DispList(); system("pause"); return 0; }
这段代码存在一些错误:
1. 在main函数中定义变量n、x、i时未指定类型,应该改为:
```
int n, x, i;
```
2. 在Insert函数中,for循环的初始值应该为i=length-1,循环条件应该为i>=0,循环变量应该为i--,因为要将i位置及之后的元素都向后移动一位,应该改为:
```
for(int j=length-1; j>=i; j--)
{
data[j+1] = data[j];
}
data[i] = x;
length++;
```
3. 在Reverse函数中,循环条件应该为i<length/2,循环变量应该为i++,因为要将前半部分的元素和后半部分的元素交换位置,应该改为:
```
for(int i=0; i<length/2; i++)
{
T temp = data[i];
data[i] = data[length-i-1];
data[length-i-1] = temp;
}
```
4. 在main函数中,定义SeqList对象时应该指定模板参数的类型,应该改为:
```
SeqList<int> l;
```
5. 在Located函数中,如果找到元素x,应该返回i+1,因为i是从0开始计数的,实际位置是i+1,应该改为:
```
return i+1;
```
#include <stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; } LinkList; void Create(LinkList *L,int a[],int n) { int i; LinkList *s,*r; L=(LinkList *)malloc(sizeof(LinkList)); L->data=a[0]; L->next=NULL; r=L; for(i=1; i<n; ++i) { s=(LinkList *)malloc(sizeof(LinkList)); s->data=a[i]; r->next=s; r=s; } r->next=NULL; } int count(LinkList *L) { if(L==NULL) return 0; else return count(L->next)+1; } void DispList(LinkList *L) { if(L == NULL) return; else { count(L->data); // 调用计数函数 DispList(L->next); // 递归遍历链表 } } int main() { LinkList *L; int a[10]= {1,2,3,4,5,6,7,8,9,10};//作为预设单链表中的data值 Create(L,a,10);//尾插法将a数组中的值插入链表 printf("单链表为: %d\n"); DispList(L); printf("节点个数为:\n"); return 0; }
这段代码存在问题,主要是在 Create 函数中传入的 LinkList 指针没有被正确赋值,导致后续的操作都无法进行。此外,在 main 函数中调用 DispList 函数时没有传入链表指针,应该传入 L。下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
} LinkList;
void Create(LinkList **L, int a[], int n)
{
int i;
LinkList *s, *r;
*L = (LinkList *)malloc(sizeof(LinkList));
(*L)->data = a[0];
(*L)->next = NULL;
r = *L;
for(i = 1; i < n; ++i)
{
s = (LinkList *)malloc(sizeof(LinkList));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
int count(LinkList *L)
{
if(L == NULL)
return 0;
else
return count(L->next) + 1;
}
void DispList(LinkList *L)
{
if(L == NULL)
return;
else
{
printf("%d ", L->data); // 输出当前节点的值
DispList(L->next); // 递归遍历链表
}
}
int main()
{
LinkList *L;
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 作为预设单链表中的data值
Create(&L, a, 10); // 尾插法将a数组中的值插入链表
printf("单链表为: ");
DispList(L);
printf("\n节点个数为:%d\n", count(L));
return 0;
}
```
这个程序的作用是创建一个单链表,然后输出链表中的元素,并统计链表中节点的数量。程序中使用了尾插法创建链表,递归遍历链表输出元素,递归计算链表中节点数量等操作。