如何对结构体进行排序

CrazyDogHH3 2005-12-22 10:04:12
小弟我想新建一个动态的指针数组*index[],然后用其对结构体进行排序,请问如何操作呢?~~首先前面那个动态创建的就出了问题了...假设我现在要创建一个个数为n的index数组,然后对结构体按mark排序,希望大家帮帮忙~~

struct students
{
int mark;
char *name;
};

谢谢大家
...全文
251 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyDogHH3 2005-12-22
  • 打赏
  • 举报
回复
谢谢楼上三位大哥,小弟基本上明白了~~谢啦~~~
Mr_Yang 2005-12-22
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

typedef struct NODE
{
int num;
struct NODE *next;
}NODE;

struct NODE *create(void) // 创建链表
{
int n = 0;
int temp = 0;
struct NODE *head = NULL;
struct NODE *p1 = NULL, *p2 = NULL;

printf("请输入将要创建为链表的数字序列,输入0结束:\n");

while (1)
{
scanf("%d", &temp);
if (0 != temp)
{
p1 = (struct NODE *)malloc(sizeof(struct NODE));
p1->num = temp;
++n;
if (1 == n)
head = p1;
else
{
p2->next = p1;
}
p2 = p1;
}
else
break;
}

if (head != NULL)
p2->next = NULL;
return head;
}

void destory(struct NODE *LinkList) // 释放链表
{
if (LinkList == NULL)
return;

struct NODE *p1 = NULL, *p2 = NULL;
p1 = LinkList;

while(p1 != NULL)
{
p2 = p1->next;
free(p1);
p1 = p2;
}
}

void Reverse(struct NODE *&LinkList) // 求链表的逆序
{
if (LinkList == NULL || LinkList->next == NULL)
return ;

struct NODE *p1 = NULL, *p2 = NULL;

p1 = p2 = LinkList;
LinkList = NULL;

while (p2 != NULL)
{
p2 = p2->next;
p1->next = LinkList;
LinkList = p1;
p1 = p2;
}
}

void InsertSort(NODE *&LinkList) // 对链表插入排序
{
if (LinkList == NULL || LinkList->next == NULL)
return;

NODE *p1 = NULL, *p2 = NULL;
p1 = LinkList;

while (p1->next != NULL)
{
if (p1->next->num < p1->num)
{
NODE *temp = p1->next;
p1->next = temp->next;
if (LinkList->num > temp->num)
{
temp->next = LinkList;
LinkList = temp;
}
else for (p2 = LinkList; p2 != p1; p2=p2->next)
{
if (p2->next->num > temp->num)
{
temp->next = p2->next;
p2->next = temp;
break;
}
}
}
else
p1 = p1->next;
}
}

void SelectSort(NODE *&LinkList) // 对链表进行选择排序
{
if (LinkList == NULL || LinkList->next == NULL)
return;

NODE *p1 = NULL, *p2 = NULL, *pMin = NULL;
p1 = LinkList;

while (p1 != NULL)
{
pMin = p1;
for (p2=p1->next; p2!=NULL; p2=p2->next)
{
if (p2->num < pMin->num)
{
pMin = p2;
}
}
swap(p1->num, pMin->num);
p1 = p1->next;
}
}


void Print(struct NODE *LinkList) // 打印链表
{
struct NODE *p;
p = LinkList;
while (p != NULL)
{
printf("%d\t", p->num);
p = p->next;
}
printf("\n");
}

int main(void)
{
struct NODE *list;

list = create();
Print(list);
InsertSort(list);
Print(list);
Reverse(list);
Print(list);
SelectSort(list);
Print(list);
destory(list);

system("pause");
return 0;
}

仅供参考。
useresu 2005-12-22
  • 打赏
  • 举报
回复
其实最简单的方法是用sort()

vector<students> stu;

bool lessmark(const students& s1,const students& s2)
{
return s1.mark < s2.mark;
}

stu.push_back("name1");
//....


sort(stu.begin(),stu.end(),lessmark);



dx30611 2005-12-22
  • 打赏
  • 举报
回复
student **index=new student*[10];
for(int i=0;i<10;i++)
index[i]=new student;
排序就跟一般的数组排序一样

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧