| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1130 人关注过本帖
标题:C语言链表排序 如果输入的数据不是5个 不确定多少个 怎么弄?
只看楼主 加入收藏
lq32413931
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-12-20
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:2 
C语言链表排序 如果输入的数据不是5个 不确定多少个 怎么弄?
#include
#include
typedef int ElemType;
typedef struct node
{
    ElemType data;
    struct node *next;
}linkNode, *linklist;
/*
*功能:初始化链表
*返回值:链表首地址
*/
linklist initList()
{
    linklist head;
    head = (linklist)malloc(sizeof(linkNode));
    if(head == NULL)
        return NULL;
    head->next = NULL;
    return head;
}

/*
*功能:求链表长度(头结点不计算)
*参数:链表首地址
*返回值:链表结点数
*/
int length(linklist head)
{
    int len = 0;
    if(head == NULL)
        return 0;
    head = head->next;
    while(head != NULL)
    {
        ++len;
        head = head->next;
    }
    return len;
}
/*
*功能:判断两个结点的数据大小
*参数:两个结点的地址
*返回值:firstNode中数据大于secondNode中数据返回1
*firstNode中数据等于secondNode中数据返回0
*firstNode中数据小于secondNode中数据返回-1
*传递参数有问题时返回-2
*/
int nodeCompare(linklist firstNode, linklist secondNode)
{
    if(firstNode->data > secondNode->data)
        return 1;
    else if(firstNode->data == secondNode->data)
        return 0;
    else if(firstNode->data < secondNode->data)
        return -1;
    return -2;
}
/*
*功能:申请空间
*参数:结点(数据)
*返回值:指向结点的指针
*/
linklist makeNode(linkNode nodeData)
{
    linklist newNode;
    newNode = (linklist)malloc(sizeof(linkNode));
    if(newNode == NULL)
        return NULL;
    newNode->data = nodeData.data;
    return newNode;
}
/*
*功能:输出链表数据
*参数:链表首地址
*/
void printList(linklist head)
{
    if(head == NULL || head->next == NULL)
        return;
    head = head->next;
    printf("\nlinklist:\n");
    while(head != NULL)
    {
        printf("%d  ", head->data);
        head = head->next;
    }
    printf("\n");
}
/*
*功能:链表排序(带头结点)
*参数:链表首地址
*
*/
void listSort(linklist head)
{
    linklist pre, mid, tai;
    int i, j;
    int len = length(head);
    if(head == NULL || head->next == NULL)
        return;
    for(i = 0; i < len - 1; ++i)
    {
        pre = head;
        mid = head->next;
        tai = mid->next;
        for(j = 0; j < len - i - 1; ++j)
        {
            if(nodeCompare(mid, tai) == 1)
            {
                pre->next = mid->next;
                mid->next = tai->next;
                tai->next = mid;               
            }
            pre = pre->next;
            mid = pre->next;
            tai = mid->next;           
        }
    }
}
/*
*功能:在链表尾部插入结点
*参数:链表首地址,待插入结点地址
*/
void pushBack(linklist head, linklist insertNode)
{
    if(head == NULL)
        return;
    while(head->next != NULL)
    {
        head = head->next;
    }
    head->next = insertNode;
    insertNode->next = NULL;
}
/*
*功能:在链表头部插入结点
*参数:链表首地址,待插入结点地址
*/
void pushFront(linklist head, linklist insertNode)
{
    if(head == NULL)
        return;
    insertNode->next = head->next;
    head->next = insertNode;
}
/*
*功能:释放链表空间
*参数:链表首地址
*返回值:释放成功则返回NULL
*/
linklist freeList(linklist head)
{
    linklist p;
    p = head;
    while(p != NULL)
    {
        p = p->next;
        free(head);
        head = p;      
    }
    return head;
}
int main()
{
    linklist list, insertNode;
    linkNode newNode;
    int i;
    list = initList();
    for(i = 0; i < 5; ++i)
    {
        //newNode.data = i;
        scanf("%d", &newNode.data);
        insertNode = makeNode(newNode);      
        pushBack(list, insertNode);
    }
    printList(list);
    listSort(list);
    printList(list);
    freeList(list);
    return 0;
}
搜索更多相关主题的帖子: include return C语言 
2011-12-20 21:28
利剑长风
Rank: 2
等 级:论坛游民
帖 子:11
专家分:32
注 册:2011-12-18
收藏
得分:0 
我表示还不会
2011-12-21 11:26
离开天空的云
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:110
专家分:198
注 册:2011-8-12
收藏
得分:20 
我以前写的一个关于链表 创建 输入 排序的程序 你看看吧
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<Windows.h>
int win;                      //用于存放节点个数//
struct s
{
    int a;   //存放有效数据//
    struct s *zzy;  //存放下一个节点的地址//
};
int main(void)
{
    void lianbiao(struct s *tzz);            
    void pxlianbiao(struct s *tzz);
    struct s *tzz=(struct s *)malloc(sizeof(struct s)); //定义链表的头指针,并存放分配新内存后的地址
    lianbiao(tzz);         //调用创建链表函数
    pxlianbiao(tzz);      //调用排序函数
    getch();
    return 0;
}
void lianbiao(struct s *tzz)  //创建创建链表函数//
{
    void srlianbiao(struct s *tzz);
    struct s *fplc=0,*syzz=tzz;  //分别定义存放内存地址存放指针和上一节点地址//
    int i,n;
    printf("输入需要创建链表节点个数:  ");
    win:scanf("%d",&n);
    if(n<0)
    {
        printf("输入非法!请重新输入:");
        goto win;                                 
    }
    win=n;
    for(i=0;i<n-1;i++)
    {
        fplc=(struct s *)malloc(sizeof(struct s));  //分配内存到变量fplc//
        if(fplc==0)            //判断内存分配是否正常 否者结束程序//
        {
            printf("分配内存错误!程序结束....");
            exit(1);                         //结束程序//
        }
        syzz->zzy=fplc;
        syzz=fplc;
    }
    if(n==1)
        tzz->zzy=0;
    else
        fplc->zzy=0;
    srlianbiao(tzz);              //调用输入函数//
}
void srlianbiao(struct s *tzz)
{
    struct s *a=tzz;
    int f;
    for(f=0;a!=0;f++)
    {
        printf("请输入第%d个节点数据域的值:",f+1);
        w:scanf("%d",&a->a);
        if(a->a<0)
        {
            printf("输入错误!请重新输入:");
            goto w;
        }
        a=a->zzy;
    }
}
void pxlianbiao(struct s *tzz)
{
    struct s *f=tzz,*i;
    char r;int ns,jc=0;   //ns用来存放交换值,jc用来计次//           
    printf("排序后...\n");
    if(win==1)
    {
        printf("一个节点无法排序!\n是否直接输出?(Y/N)");
        fflush(stdin);
        iii:scanf("%c",&r);
        if(r=='Y'||r=='y')
            printf("第1个节点的数据域的值为:%d",tzz->a);
        else if(r=='N'||r=='n')
        {
            printf("程序结束...");
            exit(1);
        }
        else
        {
            printf("输入错误!请重新输入:");
            getchar();
            goto iii;
        }
    }
    else
    {
        while(f!=0)
        {
            jc=jc+1;
            i=f->zzy;        //每一次内循环时让I指向F的下一节点//
            while(i!=0)
            {
                if(f->a<i->a)
                {
                    ns=f->a;
                    f->a=i->a;    //交换数据域的值 //
                    i->a=ns;
                }
                i=i->zzy;       //指向下一节点//
            }
            printf("第%d个节点数据域的值为:%d\n",jc,f->a);
            f=f->zzy;        //指向下一节点  //
        }
    }
}
2011-12-21 18:39
快速回复:C语言链表排序 如果输入的数据不是5个 不确定多少个 怎么弄?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022456 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved