| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 843 人关注过本帖
标题:求助纠正“单链表的基本操作”
只看楼主 加入收藏
淡若清雪
Rank: 2
等 级:论坛游民
帖 子:9
专家分:10
注 册:2010-4-17
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
求助纠正“单链表的基本操作”
本人新手,以下是一个“单链表的基本操作”,是用VS2008编写的C语言,有些错误,请指正,小弟感激不尽!
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef char ElementType;
/*结点结构定义*/
struct ListNode
{
    ElementType data;
    struct ListNode *next;
};
typedef struct ListNode Node;
typedef Node *Linklist;
/*建立单表*/
Linklist creat_list(Linklist head)
{
    Linklist ptr,temp;
    char ch;
    head=(Node*) malloc(sizeof(Node));
    if(head==NULL)
        printf("错误:空间溢出!\n");
    else
    {
        head->next=NULL;
        ptr=head;
        printf("请输入数据元素,回车(输入#结束):\n");
        while((ch=getchar())!='#')
        {
            temp=(Node*)malloc(sizeof(Node));
            temp->next=NULL;
            temp->data=ch;
            ptr->next=temp;
            ptr=temp;
            fflush(stdin);
            printf("请输入数据元素(输入#结束):\t");
        }
    }
    return head->next;
}
/*画线函数*/
char draw_line(char c)
{
    int i;
    printf("\n");
    for(i=0;i<60;i++)
        printf("%c",c);
    printf("\n");
}
/*打印链表*/
void print_list(Linklist head)
{
    Linklist ptr;
    ptr=head;
    draw_line('-');
    printf("链表元素为:\n");
    while(ptr)
    {
        printf("%3c",ptr->data);
        ptr=ptr->next;
    }
    draw_line('-');
}
/*释放结点空间*/
void free_list(Linklist head)
{
    Linklist temp;
    while(head)
    {
        temp=head;
        head=head->next;
        free(temp);
    }
    printf("\n链表结点空间释放成功\n");
}
/*插入新结点*/
Linklist insert_list(Linklist head,Linklist new,ElementType data)
{
    Linklist ptr;
    ElementType date;
    printf("请输入要插入的元素:");
    date=getchar();
    new->data=date;
    ptr=head;
    while(1)
    {
        if(head==NULL)
        {
            new->next=head;
            head=new;
            break;
        }
        else if(ptr->data==data)
        {
            new->next=ptr->next;
            ptr->next=new;
            break;
        }
        else
            ptr=ptr->next;
    }
    return head;
}
/*删除链表中的结点*/
Linklist delete_list(Linklist head,ElementType data)
{
    Linklist ptr,prv;
    ptr=head;
    while(1)
    {
        if(ptr->next==NULL)
        {
            printf("没有找到所要删除的元素!\n");
            break;
        }
        if(head->data==data)
        {
            head=ptr->next;
            free(ptr);
            break;
        }
        prv=ptr;
        ptr=ptr->next;
        if(ptr->data==data)
        {
            prv->next=ptr->next;
            free(prv);
            break;
        }
    }
    return head;
}
/*修改结点的数据域*/
Linklist modify_list(Linklist head,ElementType data)
{
    Linklist ptr;
    ElementType date;
    ptr=head;
    while(1)
    {
        if(ptr->next==NULL)
        {
            printf("没有找到所要修改的元素!\n");
            break;
        }
        else if(head->data==data)
        {
            fflush(stdin);
            printf("请输入覆盖%c的元素:",data);
            scanf_s("%c",&date);
            ptr->data=date;
            fflush(stdin);
            break;
        }
        else if(ptr->data==data)
        {
            fflush(stdin);
            printf("请输入覆盖%c的元素:",data);
            scanf_s("%c",&date);
            ptr->data=date;
            fflush(stdin);
            break;
        }
        else
            ptr=ptr->next;
    }
    return head;
}
/*链表的转置*/
Linklist invert_list(Linklist head)
{
    Linklist ptr,prv,next;
    prv=head;
    ptr=prv->next;
    prv->next=NULL;
    next=ptr->next;
    ptr->next=prv;
    prv=ptr;
    ptr=next;
    while(ptr->next)
    {
        next=ptr->next;
        ptr->next=prv;
        prv=ptr;
        ptr=next;
    }
    ptr->next=prv;
    return head;
}

/*单链表主函数*/
int main()
{
    Linklist head=0, new;
    ElementType data;
    int choose=-1;  /*在这要加head=null;*/
     int clrscr();
    draw_line('*');
    head=creat_list(head);
    print_list(head);
    while(1)
    {
        printf("+-----------------------Menu-----------------------------------+\n");
        printf("|  1、插入  2、删除  3、修改  4、转置  5、释放  0  退出  | \n");
        printf("+-----------------------Menu-----------------------------------+\n");
        printf("请选择(0--5):");
        scanf_s("%d",choose);
        switch(choose)
        {
        case 0:
            exit(0);
            break;
        case 1:
            new=(Node*) malloc(sizeof(Node));
            new->next=NULL;
            fflush(stdin);
        printf("\n请输入在这个元素后面:");
        scanf_s("%f",&data);
        fflush(stdin);
        head=insert_list(head,new,data);
        print_list(head);
        break;
        case 2:
            fflush(stdin);
            printf("\n请输入要删除的元素:");
            scanf_s("%f",&data);
            fflush(stdin);
            head=delete_list(head,data);
            print_list(head);
            break;
        case 3:
            fflush(stdin);
            printf("\n请输入你所要修改的元素:");
            scanf_s("%f",&data);
            fflush(stdin);
            head=modify_list(head,data);
            print_list(head);
            break;
        case 4:
            head=invert_list(head);
            print_list(head);
            break;
        case 5:
            free_list(head);
            break;
        default:
            printf("\n非法选择!\n");
            break;
        }
    }
    return 0;
}
搜索更多相关主题的帖子: 单链 
2010-04-19 18:56
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:6 
你还是看别人写的吧

Fight  to win  or  die...
2010-04-21 19:51
shiyuehai
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:96
专家分:116
注 册:2009-9-4
收藏
得分:6 
我觉得你程序在运行的过程中应该保护好头结点,即保护好head的指向,而上面好像总是改变head的值,这样会使你的链表丢失,不知道这样说对不对,我也是初学者
2010-04-21 21:51
lgnu
Rank: 1
等 级:新手上路
帖 子:8
专家分:9
注 册:2010-4-21
收藏
得分:6 
太长了,没时间看完:
这个函数有点问题
Linklist creat_list(Linklist head)
{
    Linklist ptr,temp;
    char ch;
    head=(Node*) malloc(sizeof(Node));
    if(head==NULL)
        printf("错误:空间溢出!\n");//这里只做了判断,没有直接返回.如果head==NULL,那么return head->next也会执行
    else
    {
        head->next=NULL;
        ptr=head;
        printf("请输入数据元素,回车(输入#结束):\n");
        while((ch=getchar())!='#')
        {
            temp=(Node*)malloc(sizeof(Node));
            temp->next=NULL;
            temp->data=ch;
            ptr->next=temp;
            ptr=temp;
            fflush(stdin);
            printf("请输入数据元素(输入#结束):\t");
        }
    }
    return head->next;
}
2010-04-21 22:21
淡若清雪
Rank: 2
等 级:论坛游民
帖 子:9
专家分:10
注 册:2010-4-17
收藏
得分:0 
回复 2楼 aipb2007
这位大哥,肯定知道错在哪里了?帮帮忙,小弟感激不尽
2010-04-23 00:14
快速回复:求助纠正“单链表的基本操作”
数据加载中...
 
   



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

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