首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言双链表有关问题

2012-05-05 
C语言双链表问题请帮我看看下面这段代码,哪里有问题,谢谢。编译不过去。C/C++ code#include stdio.h#inclu

C语言双链表问题
请帮我看看下面这段代码,哪里有问题,谢谢。编译不过去。

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>#define LEN sizeof(struct DoubleLinkList)typedef struct DoubleLinkList{    struct DoubleLinkList *previous;    char *name;    int  *english_grade;    int  *math_grade;    struct DoubleLinkList *next;}DB,*PDB;void printInfo();void CreatDoubleLinkList(char *name,int english_grade,int math_grade);void CreatNewDot(PDB *newDot,char *name,int english_grade,int math_grade);PDB SearchDot(char *name);void InsertDot(PDB dot,char *name);void DeleteDot(char *name);void ChangeDot(char *originName,char *changeName);void DeleteAll();PDB Head=NULL;PDB newDot=NULL;char *name;int  *english_grade;int  *math_grade;char *chanName,*inputName;int order=-1;int main(){    do    {    printf("***********************命令菜单***************************\n");    printf("***                                                    ***\n");    printf("***********************1:创建双向链表头节点***************\n");    printf("***                                                    ***\n");    printf("***********************2:创建新节点***********************\n");    printf("***                                                    ***\n");    printf("***********************3:改变节点值***********************\n");    printf("***                                                    ***\n");    printf("***********************4:删除节点*************************\n");    printf("***                                                    ***\n");    printf("***********************5:打印现在列表的值*****************\n");    printf("***                                                    ***\n");    printf("***********************6:释放链表所有节点*****************\n");    printf("***                                                    ***\n");    printf("***********************7:退出程序*************************\n");    printf("请输入命令:\n");    scanf("%d",&order);    switch(order)    {        case 1:            printf("请输入头结点的值(姓名,英语成绩,数学成绩):\n");            scanf("%s%d%d",name,&english_grade,&math_grade);            CreatDoubleLinkList(name,english_grade,math_grade);        break;        case 2:            printf("请输入头结点的值(姓名,英语成绩,数学成绩):\n");            scanf("%s%d%d",name,&english_grade,&math_grade);            CreatNewDot(&newDot,name,english_grade,math_grade);            printf("请输入你要插在那个节点之后(姓名):\n");            scanf("%s",inputName);            InsertDot(newDot,inputName);        break;        case 3:            printf("请输入要改变的节点的原来的值(姓名):\n");            scanf("%s",name);            printf("请输入要改变后值:\n");            scanf("%s",chanName);            ChangeDot(name,chanName);        break;        case 4:            printf("输入要删除的节点的值:\n");            scanf("%s",name);            DeleteDot(name);        break;        case 5:            printInfo();        break;        case 6:            DeleteAll();         break;        default:        break;    }    }while(order!=7);    return 0;}void printInfo(){    if(Head==NULL)    {        printf("链表为空!\n");        return ;    }    PDB pOut;    pOut = Head;    printf("链表值为:\n");    do{        printf("%s %d %d\n",pOut->name,pOut->english_grade,pOut->math_grade);        pOut=pOut->next;      }while(pOut->next!=Head->next);}void CreatDoubleLinkList(char *name,int english_grade,int math_grade){    Head=(PDB)malloc(LEN);//必须申请内存空间,不然报错,如果没有初始化为NULL,又没有分配空间,后果和严重,令CodeBlocks休克了    Head->name=name;    Head->english_grade=english_grade;    Head->math_grade=math_grade;    Head->next=Head->previous=Head;    printf("双向链表的头结点已经创建,值为:%d\n",Head->name);}void CreatNewDot(PDB *newDot,char *name,int english_grade,int math_grade){    //指针作为参数,为指针参数申请内存空间,    //必须使用双指针,实参为指针的引用,    //否则参数指针不会被分配空间,并且引起内存泄露,无法free掉     (*newDot)=(PDB)malloc(LEN);     (*newDot)->name=name;     (*newDot)->english_grade=english_grade;     (*newDot)->math_grade=math_grade;}PDB SearchDot(char *name){    if(Head==NULL)    {        printf("链表为空,没有可以删除的节点!\n");        return NULL;    }    else if(strcmp(Head->name,name))    {        return Head;    }    else    {        PDB search=Head->next;        while((strcmp(Head->name,name))!=0&&search!=Head)        {            search=search->next;        }        if(search==Head)        return NULL;        else        return search;    }    return NULL;}void InsertDot(PDB dot,char *name){    if(dot==NULL)    return ;    else    {        PDB AfterDot=SearchDot(name);        dot->previous=AfterDot;        dot->next=AfterDot->next;        AfterDot->next->previous=dot;        AfterDot->next=dot;    }    printf("数据插入成功!\n");}void DeleteDot(char *name){    PDB delDot=SearchDot(name);    if(delDot==NULL)    {        printf("节点不存!\n");        return ;    }    delDot->previous->next=delDot->next;    delDot->next->previous=delDot->previous;    free(delDot);    printf("节点删除成功!\n");}void ChangeDot(char *originName,char *changeName){    PDB chanDot=SearchDot(originName);    if(chanDot==NULL)    {        printf("不存在节点值为:%s 的节点!\n",originName);        return ;    }    else    {        chanDot->name=changeName;         printf("节点值更改成功!\n");    }}void DeleteAll(){    PDB del=NULL;    if(Head==NULL)    {        printf("链表为空,不需要释放!\n");        return ;    }    while(Head->next!=Head)    {        del=Head->next;        Head->next=del->next;        del->next->previous=Head;        free(del);    }    if(Head!=NULL)    free(Head);    Head=NULL;    printf("链表释放完毕!");} 



[解决办法]
C/C++ code
void printInfo(){    PDB pOut;       //  变量定义要放在函数开头    if(Head==NULL)    {        printf("链表为空!\n");        return ;    }    pOut = Head;    printf("链表值为:\n");    do{        printf("%s %d %d\n",pOut->name,pOut->english_grade,pOut->math_grade);        pOut=pOut->next;      }while(pOut->next!=Head->next);}
[解决办法]
错误有些多啊
C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>#define LEN sizeof(struct DoubleLinkList)typedef struct DoubleLinkList{    struct DoubleLinkList *previous;    char name[100];    int  english_grade;    int  math_grade;    struct DoubleLinkList *next;}DB,*PDB;void printInfo();void CreatDoubleLinkList(char *name,int english_grade,int math_grade);void CreatNewDot(PDB *newDot,char *name,int english_grade,int math_grade);PDB SearchDot(char *name);void InsertDot(PDB dot,char *name);void DeleteDot(char *name);void ChangeDot(char *originName,char *changeName);void DeleteAll();PDB Head=NULL;PDB newDot=NULL;char name[100];int  english_grade;int  math_grade;char chanName[100],inputName[100];int order=-1;int main(){    do    {        printf("***********************命令菜单***************************\n");        printf("***                                                    ***\n");        printf("***********************1:创建双向链表头节点***************\n");        printf("***                                                    ***\n");        printf("***********************2:创建新节点***********************\n");        printf("***                                                    ***\n");        printf("***********************3:改变节点值***********************\n");        printf("***                                                    ***\n");        printf("***********************4:删除节点*************************\n");        printf("***                                                    ***\n");        printf("***********************5:打印现在列表的值*****************\n");        printf("***                                                    ***\n");        printf("***********************6:释放链表所有节点*****************\n");        printf("***                                                    ***\n");        printf("***********************7:退出程序*************************\n");        printf("请输入命令:\n");        scanf("%d",&order);        memset(name,0,sizeof(name));        switch(order)        {        case 1:            printf("请输入头结点的值(姓名,英语成绩,数学成绩):\n");            scanf("%s%d%d",name,&english_grade,&math_grade);            CreatDoubleLinkList(name,english_grade,math_grade);            break;        case 2:            printf("请输入头结点的值(姓名,英语成绩,数学成绩):\n");            scanf("%s%d%d",name,&english_grade,&math_grade);            CreatNewDot(&newDot,name,english_grade,math_grade);            printf("请输入你要插在那个节点之后(姓名):\n");            scanf("%s",inputName);            InsertDot(newDot,inputName);            break;        case 3:            printf("请输入要改变的节点的原来的值(姓名):\n");            scanf("%s",name);            printf("请输入要改变后值:\n");            scanf("%s",chanName);            ChangeDot(name,chanName);            break;        case 4:            printf("输入要删除的节点的值:\n");            scanf("%s",name);            DeleteDot(name);            break;        case 5:            printInfo();            break;        case 6:            DeleteAll();            break;        default:            break;        }    }while(order!=7);    return 0;}void printInfo(){    if(Head==NULL)    {        printf("链表为空!\n");        return ;    }    PDB pOut;    pOut = Head;    printf("链表值为:\n");    do{        printf("%s %d %d\n",pOut->name,pOut->english_grade,pOut->math_grade);        pOut=pOut->next;    }while(pOut->next!=Head->next);}void CreatDoubleLinkList(char *name,int english_grade,int math_grade){    Head=(PDB)malloc(LEN);//必须申请内存空间,不然报错,如果没有初始化为NULL,又没有分配空间,后果和严重,令CodeBlocks休克了    memcpy(Head->name,name,sizeof(Head->name));    Head->english_grade=english_grade;    Head->math_grade=math_grade;    Head->next=Head->previous=Head;    printf("双向链表的头结点已经创建,值为:%s\n",Head->name);}void CreatNewDot(PDB *newDot,char *name,int english_grade,int math_grade){    //指针作为参数,为指针参数申请内存空间,    //必须使用双指针,实参为指针的引用,    //否则参数指针不会被分配空间,并且引起内存泄露,无法free掉    (*newDot)=(PDB)malloc(LEN);    memcpy(Head->name,name,sizeof(Head->name));    (*newDot)->english_grade=english_grade;    (*newDot)->math_grade=math_grade;}PDB SearchDot(char *name){    if(Head==NULL)    {        printf("链表为空,没有可以删除的节点!\n");        return NULL;    }    else if(strcmp(Head->name,name)==0)    {        return Head;    }    else    {        PDB search=Head->next;        while((strcmp(Head->name,name))!=0&&search!=Head)        {            search=search->next;        }        if(search==Head)            return NULL;        else            return search;    }    return NULL;}void InsertDot(PDB dot,char *name){    if(dot==NULL)        return ;    else    {        PDB AfterDot=SearchDot(name);        dot->previous=AfterDot;        dot->next=AfterDot->next;        AfterDot->next->previous=dot;        AfterDot->next=dot;    }    printf("数据插入成功!\n");}void DeleteDot(char *name){    PDB delDot=SearchDot(name);    if(delDot==NULL)    {        printf("节点不存!\n");        return ;    }    delDot->previous->next=delDot->next;    delDot->next->previous=delDot->previous;    free(delDot);    printf("节点删除成功!\n");}void ChangeDot(char *originName,char *changeName){    PDB chanDot=SearchDot(originName);    if(chanDot==NULL)    {        printf("不存在节点值为:%s 的节点!\n",originName);        return ;    }    else    {        memcpy(Head->name,name,sizeof(Head->name));        printf("节点值更改成功!\n");    }}void DeleteAll(){    PDB del=NULL;    if(Head==NULL)    {        printf("链表为空,不需要释放!\n");        return ;    }    while(Head->next!=Head)    {        del=Head->next;        Head->next=del->next;        del->next->previous=Head;        free(del);    }    if(Head!=NULL)        free(Head);    Head=NULL;    printf("链表释放完毕!");} 


[解决办法]

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>#define LEN sizeof(struct DoubleLinkList)typedef struct DoubleLinkList{    struct DoubleLinkList *previous;    char *name;    int  english_grade;    int  math_grade;    struct DoubleLinkList *next;}DB,*PDB;void printInfo();void CreatDoubleLinkList(char *name,int english_grade,int math_grade);void CreatNewDot(PDB *newDot,char *name,int english_grade,int math_grade);PDB SearchDot(char *name);void InsertDot(PDB dot,char *name);void DeleteDot(char *name);void ChangeDot(char *originName,char *changeName);void DeleteAll();PDB Head=NULL;PDB newDot=NULL;char name[10];int  english_grade=0;int  math_grade=0;char *chanName,*inputName;int order=-1;int main(){    do    {        printf("***********************命令菜单***************************\n");        printf("***                                                    ***\n");        printf("***********************1:创建双向链表头节点***************\n");        printf("***                                                    ***\n");        printf("***********************2:创建新节点***********************\n");        printf("***                                                    ***\n");        printf("***********************3:改变节点值***********************\n");        printf("***                                                    ***\n");        printf("***********************4:删除节点*************************\n");        printf("***                                                    ***\n");        printf("***********************5:打印现在列表的值*****************\n");        printf("***                                                    ***\n");        printf("***********************6:释放链表所有节点*****************\n");        printf("***                                                    ***\n");        printf("***********************7:退出程序*************************\n");        printf("请输入命令:\n");        scanf("%d",&order);        switch(order)        {        case 1:            printf("请输入头结点的值(姓名,英语成绩,数学成绩):\n");            scanf("%s%d%d",name,&english_grade,&math_grade);            CreatDoubleLinkList(name,english_grade,math_grade);            break;        case 2:            printf("请输入头结点的值(姓名,英语成绩,数学成绩):\n");            scanf("%s%d%d",name,&english_grade,&math_grade);            CreatNewDot(&newDot,name,english_grade,math_grade);            printf("请输入你要插在那个节点之后(姓名):\n");            scanf("%s",inputName);            InsertDot(newDot,inputName);            break;        case 3:            printf("请输入要改变的节点的原来的值(姓名):\n");            scanf("%s",name);            printf("请输入要改变后值:\n");            scanf("%s",chanName);            ChangeDot(name,chanName);            break;        case 4:            printf("输入要删除的节点的值:\n");            scanf("%s",name);            DeleteDot(name);            break;        case 5:            printInfo();            break;        case 6:            DeleteAll();            break;        default:            break;        }    }while(order!=7);    return 0;}void printInfo(){    if(Head==NULL)    {        printf("链表为空!\n");        return ;    }    PDB pOut;    pOut = Head;    printf("链表值为:\n");    do{        printf("%s %d %d\n",pOut->name,pOut->english_grade,pOut->math_grade);        pOut=pOut->next;    }while(pOut->next!=Head->next);}void CreatDoubleLinkList(char *name,int english_grade,int math_grade){    Head=(PDB)malloc(LEN);//必须申请内存空间,不然报错,如果没有初始化为NULL,又没有分配空间,后果和严重,令CodeBlocks休克了    Head->name=name;    Head->english_grade=english_grade;    Head->math_grade=math_grade;    Head->next=Head->previous=Head;    printf("双向链表的头结点已经创建,值为:%d\n",Head->name);}void CreatNewDot(PDB *newDot,char *name,int english_grade,int math_grade){    //指针作为参数,为指针参数申请内存空间,    //必须使用双指针,实参为指针的引用,    //否则参数指针不会被分配空间,并且引起内存泄露,无法free掉    (*newDot)=(PDB)malloc(LEN);    (*newDot)->name=name;    (*newDot)->english_grade=english_grade;    (*newDot)->math_grade=math_grade;}PDB SearchDot(char *name){    if(Head==NULL)    {        printf("链表为空,没有可以删除的节点!\n");        return NULL;    }    else if(strcmp(Head->name,name))    {        return Head;    }    else    {        PDB search=Head->next;        while((strcmp(Head->name,name))!=0&&search!=Head)        {            search=search->next;        }        if(search==Head)            return NULL;        else            return search;    }    return NULL;}void InsertDot(PDB dot,char *name){    if(dot==NULL)        return ;    else    {        PDB AfterDot=SearchDot(name);        dot->previous=AfterDot;        dot->next=AfterDot->next;        AfterDot->next->previous=dot;        AfterDot->next=dot;    }    printf("数据插入成功!\n");}void DeleteDot(char *name){    PDB delDot=SearchDot(name);    if(delDot==NULL)    {        printf("节点不存!\n");        return ;    }    delDot->previous->next=delDot->next;    delDot->next->previous=delDot->previous;    free(delDot);    printf("节点删除成功!\n");}void ChangeDot(char *originName,char *changeName){    PDB chanDot=SearchDot(originName);    if(chanDot==NULL)    {        printf("不存在节点值为:%s 的节点!\n",originName);        return ;    }    else    {        chanDot->name=changeName;        printf("节点值更改成功!\n");    }}void DeleteAll(){    PDB del=NULL;    if(Head==NULL)    {        printf("链表为空,不需要释放!\n");        return ;    }    while(Head->next!=Head)    {        del=Head->next;        Head->next=del->next;        del->next->previous=Head;        free(del);    }    if(Head!=NULL)        free(Head);    Head=NULL;    printf("链表释放完毕!");} 


[解决办法]
在把1楼的指出的问题加上就代码应该就没问题了
[解决办法]
你的代码编译时好多警告啊。用法别太奇怪了。

像全局变量english_grade、math_grade都被定义为指向整数的指针,而且没有将它们指向具体的整型变量,可后面使用的时候:scanf("%s%d%d",name,&english_grade,&math_grade);???

把整数送进指针变量里保存?那又为什么要用指针变量?
[解决办法]
仅供参考

C/C++ code
//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中#include <stdio.h>#include <stdlib.h>#include <string.h>#include <io.h>struct FB {    char fn[256];    size_t fl;    char *b;    struct FB *next;    struct FB *prev;} *fh,*fb,*ft;char ln[256];char fpn[256];FILE *af;FILE *f;int L,n;int main() {    system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");    af=fopen("c:\\allfn.txt","r");    if (NULL==af) {        printf("Can not open file c:\\allfn.txt!\n");        return 1;    }    fh=NULL;    fb=NULL;    n=0;    while (1) {        if (NULL==fgets(ln,256,af)) break;        L=strlen(ln);        if ('\n'==ln[L-1]) ln[L-1]=0;        printf("read %s\n",ln);        strcpy(fpn,"c:\\tmp\\");        strcat(fpn,ln);        ft=(struct FB *)malloc(sizeof(struct FB));        if (NULL==ft) {            printf("Can not malloc ft!\n");            fclose(af);            return 2;//之前的malloc在main退出后由操作系统自动free        }        printf("ft[%d]==%p\n",n,ft);        strcpy(ft->fn,fpn);        f=fopen(fpn,"rb");        if (NULL==f) {            printf("Can not open file %s!\n",fpn);            fclose(af);            return 3;//之前的malloc在main退出后由操作系统自动free        }        ft->fl=_filelength(fileno(f));        ft->b=malloc(ft->fl);        if (NULL==ft->b) {            printf("Can not malloc ft->b!\n");            fclose(f);            fclose(af);            return 4;//之前的malloc在main退出后由操作系统自动free        }        printf("ft[%d]->b==%p\n",n,ft->b);        if (ft->fl!=fread(ft->b,1,ft->fl,f)) {            printf("fread error!\n");            fclose(f);            fclose(af);            return 5;//之前的malloc在main退出后由操作系统自动free        }        fclose(f);        ft->next=NULL;        if (NULL==fh) {            ft->prev=NULL;            fh=ft;        } else {            fb->next=ft;            ft->prev=fb;        }        fb=ft;        n++;    }    fclose(af);    printf("-----list-----\n");    for (ft=fh;NULL!=ft;ft=ft->next) {        printf("%8d %s\n",ft->fl,ft->fn);        if (NULL!=ft) fb=ft;    }    printf("-----free-----\n");    n--;    if (NULL!=fh) {        for (ft=fb->prev;NULL!=ft;ft=ft->prev) {            if (NULL!=ft->next->b) {                printf("ft[%d]->b==%p\n",n,ft->next->b);                free(ft->next->b);            }            if (NULL!=ft->next) {                printf("ft[%d]==%p\n",n,ft->next);                free(ft->next);            }            n--;        }        if (NULL!=fh->b) {            printf("ft[0]->b==%p\n",fh->b);            free(fh->b);        }        printf("ft[0]==%p\n",fh);        free(fh);    }    return 0;}//C:\tmp\tmp\Debug>dir /a-d c:\tmp// 驱动器 C 中的卷是 C_HD5_1// 卷的序列号是 1817-D526//// c:\tmp 的目录////找不到文件////C:\tmp\tmp\Debug>tmp//找不到文件//-----list-----//-----free-----////C:\tmp\tmp\Debug>dir /a-d c:\tmp// 驱动器 C 中的卷是 C_HD5_1// 卷的序列号是 1817-D526//// c:\tmp 的目录////2011-06-30  18:04            44,840 my_c.rar//2011-06-30  17:18             1,036 err.frm//2011-06-30  14:32            14,243 出租.txt//2011-06-28  12:08            23,681 MSDN98书签.txt//             4 个文件         83,800 字节//             0 个目录 17,041,870,848 可用字节////C:\tmp\tmp\Debug>tmp//read my_c.rar//ft[0]==00421800//ft[0]->b==00520068//read err.frm//ft[1]==00421670//ft[1]->b==0052AFC0//read 出租.txt//ft[2]==00421530//ft[2]->b==00378F28//read MSDN98书签.txt//ft[3]==004213F0//ft[3]->b==0052B3F8//-----list-----// 44840 c:\tmp\my_c.rar//  1036 c:\tmp\err.frm// 14243 c:\tmp\出租.txt// 23681 c:\tmp\MSDN98书签.txt//-----free-----//ft[3]->b==0052B3F8//ft[3]==004213F0//ft[2]->b==00378F28//ft[2]==00421530//ft[1]->b==0052AFC0//ft[1]==00421670//ft[0]->b==00520068//ft[0]==00421800////C:\tmp\tmp\Debug> 

热点排行