c语言简单排序与查找练习,c语言顺序表的查找

发布时间:2022-11-23

本文目录一览:

  1. [数据结构编程--查找与排序 题](#数据结构编程--查找与排序 题)
  2. (求救)用C语言编写——排序查找,题目如下。
  3. c语言排序和查找?

数据结构编程--查找与排序 题

#include stdlib.h
#include stdio.h
typedef struct node
{
    int data;
    struct node* next;
    struct node* pre;
} node, *link;
int droplink(link L);
// 检查表是否存在,是返回true,否返回false
bool checklink(link L)
{
    if (L == NULL)
    {
        return false;
    }
    else
    {
        return true;
    }
}
// 新建一个结点,以data作为它的值,返回指向这个结点的指针
link createnode(int data)
{
    link p;
    if ((p = (link)malloc(sizeof(node))) == NULL)
    {
        printf("malloc failed!@createnode\n");
        return NULL;
    }
    else
    {
        p->data = data;
        p->next = NULL;
        p->pre = NULL;
        return p;
    }
}
// 创建一个带头结点的链表,成功返回0,失败返回-1
int create(link L)
{
    if (checklink(L))
    {
        printf("链表已经存在,先销毁再创建!\n");
        droplink(L);
    }
    if ((L = (link)malloc(sizeof(node))) == NULL)
    {
        printf("malloc failed!\n");
        return -1;
    }
    L->next = NULL;
    L->pre = NULL;
    return 0;
}
// 统计链表长度,成功返回链表长度,失败返回-1
int getlength(link L)
{
    int length = 0;
    link p = L;
    while (p->next != NULL)
    {
        length++;
        p = p->next;
    }
    return length;
}
// 根据值查询结点
link findpos(link L, int data)
{
    if (!checklink(L))
    {
        printf("无此链表\n");
        return NULL;
    }
    link p = L;
    while (p != NULL)
    {
        if (p->data == data)
        {
            return p;
        }
        p = p->next;
    }
}
// 找出第pos位置上的结点,返回指向这个结点的指针
link findnode(link L, int pos)
{
    if (!checklink(L))
    {
        printf("无此链表\n");
        return NULL;
    }
    if (pos <= 0)
    {
        printf("位置过小!@findnode\n");
        return NULL;
    }
    link p = L;
    for (int i = 0; i < pos; i++)
    {
        if (p == NULL)
        {
            printf("位置超出链表长度!@findnode\n");
            return NULL;
        }
        p = p->next;
    }
    return p;
}
// 把n插入至rear之后,成功返回0,失败返回-1
int pushback(link L, link n)
{
    if (!checklink(L))
    {
        printf("无此链表\n");
        return -1;
    }
    int length = getlength(L);
    link rear = NULL;
    if (length == 0)
    {
        rear = L;
    }
    else
    {
        rear = findnode(L, length);
    }
    rear->next = n;
    n->pre = rear;
    rear = n;
    return 0;
}
// 把n插入至L的第pos位(0代表头结点),成功返回0,失败返回-1
int insert(link L, link n, int pos)
{
    if (!checklink(L))
    {
        printf("无此链表\n");
        return -1;
    }
    link p = findnode(L, pos);
    if (p == NULL)
    {
        printf("查找结点失败!@insert\n");
        return -1;
    }
    n->next = p->next;
    p->next = n;
    n->pre = p;
    n->next->pre = n;
    return 0;
}
// 把L链表第pos位置上的结点删除 (0代表头结点),成功返回0,失败返回-1
int delnode(link L, int pos)
{
    if (!checklink(L))
    {
        printf("无此链表\n");
        return -1;
    }
    link p = findnode(L, pos);
    if (p == NULL)
    {
        printf("查找结点失败!@delnode\n");
        return -1;
    }
    p->pre->next = p->next;
    p->next->pre = p->pre;
    free(p);
    p = NULL;
    return 0;
}
// 销毁链表L 成功返回0,失败返回-1
int droplink(link L)
{
    if (!checklink(L))
    {
        printf("无此链表\n");
        return -1;
    }
    int length = getlength(L);
    while (length > 0)
    {
        delnode(L, length);
        length = getlength(L);
    }
    free(L);
    L = NULL;
    return 0;
}
// 对链表进行排序 type为1时是升序排列,为-1时为降序 (冒泡排序法)
void sort(link L, int type)
{
    int length = getlength(L);
    if (length <= 0)
    {
        printf("升序过小!\n");
        return;
    }
    switch (type)
    {
    case 1:
        printf("升序排列链表!\n");
        break;
    case -1:
        printf("降序排列链表!\n");
        break;
    default:
        printf("参数错误!\n");
        return;
    }
    for (int i = 1; i < length; i++)
    {
        for (int j = 1; j < length; j++)
        {
            printf("i=%d,j=%d,", i, j);
            printf("findnode(L,j)->data =%d, findnode(L,j+1)->data=%d\n", findnode(L, j)->data, findnode(L, j + 1)->data);
            if (type == -1)
            {
                // 降序
                if (findnode(L, j)->data < findnode(L, j + 1)->data)
                {
                    int t = findnode(L, j)->data;
                    findnode(L, j)->data = findnode(L, j + 1)->data;
                    findnode(L, j + 1)->data = t;
                }
            }
            else
            {
                // 升序
                if (findnode(L, j)->data > findnode(L, j + 1)->data)
                {
                    int t = findnode(L, j)->data;
                    findnode(L, j)->data = findnode(L, j + 1)->data;
                    findnode(L, j + 1)->data = t;
                }
            }
        }
    }
}
void output(link L)
{
    link p = L->next;
    int i = 0;
    while (p != NULL)
    {
        printf("[%d]=\t%d\n", i, p->data);
        i++;
        p = p->next;
    }
}
main()
{
    int length;
    link L = NULL;
    // 新建链表
    create(L);
    printf("===输入数据===\n");
    printf("请输入链表结点数量:");
    scanf("%d", length);
    if (length <= 0)
    {
        printf("数量错误!退出程序\n");
        return -1;
    }
    int i = 0;
    int data;
    link tmp = NULL;
    while (i != length)
    {
        printf("请输入data值:");
        scanf("%d", data);
        tmp = createnode(data);
        pushback(L, tmp);
        i++;
    }
    output(L);
    printf("===插入新节点===\n");
    printf("请输入data值:");
    scanf("%d", data);
    tmp = createnode(data);
    insert(L, tmp, 2);
    output(L);
    printf("===查询节点===\n");
    printf("请输入要查询的data值:");
    scanf("%d", data);
    findpos(L, data);
    printf("===链表长度为%d===\n", getlength(L));
    printf("升序排序后链表为:\n");
    sort(L, 1);
    output(L);
    printf("降序排序后链表为:\n");
    sort(L, -1);
    output(L);
    getchar();
}

(求救)用C语言编写——排序查找,题目如下。

#include stdio.h
#define N 3 // 这句话的意思是N等于10(后面的19是可以改成任意的数,来表示学生的人数)
void main()
{
    void paixu(int a[N]);
    void chazhao(int a[N], int x);
    int i, score;
    // printf("请输入学生的人数:");
    // scanf("%d",N);
    int a[N];
    printf("请依次输入学生成绩:");
    for (i = 0; i <= N - 1; i++)
    {
        scanf("%d", a[i]);
    }
    paixu(a); // 调用排序的函数
    printf("请输入您要查找的成绩:");
    scanf("%d", score);
    chazhao(a, score);
}
void paixu(int a[N])
{
    int t, i, j;
    for (i = 0; i < N - 1; i++)
    {
        for (j = i + 1; j <= N - 1; j++)
        {
            if (a[i] > a[j])
            {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
    for (i = 0; i <= N - 1; i++)
    {
        printf("学生的成绩第%d名为:%d\n", i + 1, a[i]);
    }
}
void chazhao(int a[N], int x)
{
    int b = 0, i;
    for (i = 0; i <= N - 1; i++)
    {
        if (a[i] == x)
        {
            printf("这个成绩是第%d名\n", i + 1);
            b = 1;
            break;
        }
    }
    if (b == 0)
        printf("no this score!\n");
}

谢谢啦、、、、、、

c语言排序和查找?

  1. 利用readData()函数从data1.txt中读入不同规模的数据存入数组,编写基于数组的顺序查找算法,测试数据量为1万、5万、10万、20万、30万、40万和50万时的数据查询时间。
int seqsearch(int a[], int n, int key)
{
    int k = n - 1;
    while (k >= 0 && a[k] != key)
        k--;
    return (k);
}
  1. 利用readData()函数从data2.txt中读入不同规模的有序数据存入数组,编写基于数组的二分查找算法,测试数据量为1万、5万、10万、20万、30万、40万和50万时的数据查询时间。
int binSearch(int a[], int n, int key)
{
    int low = 0;
    int high = n - 1;
    int mid;
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (a[mid] == key)
            return mid;
        if (a[mid] > key)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return -1;
}
  1. 请设计冒泡排序算法函数void bubbleSort(int a[], int n),对a[1]..a[n]进行升序排序,并测试在不同数据规模下的排序效率。
void bubbleSort(int a[], int n)
{
    int i = 1, j, flag = 1;
    while (i <= n - 1 && flag)
    {
        flag = 0;
        for (j = 1; j <= n - 1 - i; j++)
            if (a[j + 1] < a[j])
            {
                a[0] = a[j];
                a[j] = a[j + 1];
                a[j + 1] = a[0];
                flag = 1;
            }
        i++;
    }
}