回 帖 发 新 帖 刷新版面

主题:[原创]一个简单的双向链表

#include <malloc.h>
#include <stdio.h>


/*定义数据域*/
typedef struct field {
    int num;float score;
}FIELD;
/*定义节点*/
typedef struct node {
    FIELD fie;
    struct node *back,*next;
}NODE;
/*定义链表*/
typedef struct link {
    NODE *head;
    int length;
}LINK;
/*填写数据域*/
void InitFie(FIELD *fie,int *num,float *score) {
    fie->num=*num,fie->score=*score;
}
/*复制数据域*/
void CopyFie(FIELD *fie,FIELD *_fie) {
    InitFie(fie,&_fie->num,&_fie->score);
}
/*填写节点*/
void InitNode(NODE *node,FIELD *fie,NODE *back,NODE *next) {
    CopyFie(&node->fie,fie);
    node->back=back,node->next=next;
}
/*创建节点*/
NODE* CreNode(FIELD *fie,NODE *back,NODE *next) {
    NODE *p=(NODE*)malloc(sizeof(NODE));
    InitNode(p,fie,back,next);
    return p;
}
/*添加节点,传送参数:头节点,要添加的节点,统计个数*/
NODE* AddNode(NODE *head,NODE *node,int *len) {
    NODE *p=head;
    for (;p&&p->next;p=p->next);
    if (!p) head=node;
    else p->next=node,node->back=p;
    (*len)++;return head;
}
/*创建并添加节点*/
NODE* CreAddNode(NODE *head,FIELD *fie,int *len) {
    return (AddNode(head,CreNode(fie,0,0),len));
}
/*插入节点,传送参数:头节点,要插入的节点,位置,统计个数*/
NODE* InsNode(NODE *head,NODE *node,int item,int *len) {
    NODE *p=head;int i=1;
    for (;p&&i<item;i++,p=p->next);
    if (i!=item&&!p) return head;
    if (item==1&&!p) head=node;
    else {
        node->back=p->back,node->next=p,p->back=node;
        if (head==p) head=node;
    }
    (*len)++;return head;
}
/*创建并插入节点*/
NODE* CreInsNode(NODE *head,FIELD *fie,int item,int *len) {
    return (InsNode(head,CreNode(fie,0,0),item,len));
}
/*删除节点,传送参数:头节点,要删除的位置,统计个数*/
NODE* DelNode(NODE *head,int item,int *len) {
    NODE *p=head;int i=1;
    for (;p&&i<item;p=p->next,i++);
    if (!p) return head;
    if (p->back) p->back->next=p->next;
    if (p->next) p->next->back=p->back;
    if (p==head) head=head->next;
    free(p),p=0;(*len)--;return head;
}
/*保存节点*/
unsigned int SaveNode(NODE *node,FILE *fp) {
    return (fwrite(&node->fie,sizeof(FIELD),1,fp));
}
/*加载节点*/
unsigned int LoadNode(FIELD *fie,FILE *fp) {
    return (fread(fie,sizeof(FIELD),1,fp));
}
/*初始化链表*/
void InitLink(LINK *list) {
    list->head=0,list->length=0;
}
/*保存链表*/
void SaveLink(LINK *list,FILE *fp) {
    NODE *p=list->head;
    for (;p;p=p->next)
        if (SaveNode(p,fp)!=1) break;
}
/*读取链表*/
NODE* LoadLink(LINK *list,FILE *fp) {
    FIELD fie;
    while (!feof(fp)) {
        if (LoadNode(&fie,fp)!=1) break;
        list->head=CreAddNode(list->head,&fie,&list->length);
    }
    return list->head;
}
/*删除链表*/
NODE* DelLink(NODE *head,int *len) {
    NODE *p;
    for (;p=head;head=head->next,free(p));
    (*len)=0;return head;
}

void Print(LINK *list) {
    NODE *p=list->head;
    if (!p) printf("list empty!\n");
    else {
        for (;p;printf("%3d,%5.2f\n",p->fie.num,p->fie.score),p=p->next);
        printf("node count:%d\n",list->length);
    }
}
void main() {
    /*测试*/
    LINK link;
    FIELD fie;
    int i;float score=(float)87.25;
    FILE *fp;char *path="E:\\abc\\abc_3";

    InitLink(&link);
    for (i=1;i<21;i++) {
        InitFie(&fie,&i,&score);
        link.head=CreAddNode(link.head,&fie,&link.length);
        score-=1;
    }
    Print(&link);

    printf("del 1\n");
    link.head=DelNode(link.head,1,&link.length);
    Print(&link);
    printf("del 3\n");
    link.head=DelNode(link.head,3,&link.length);
    Print(&link);
    printf("add 21\n");
    link.head=CreAddNode(link.head,&fie,&link.length);
    Print(&link);
    printf("ins 1\n");
    link.head=CreInsNode(link.head,&fie,1,&link.length);
    Print(&link);
    printf("save link list\n");
    if (!(fp=fopen(path,"wb"))) {
        printf("error! create file!\n");
    }
    else SaveLink(&link,fp);
    fclose(fp);
    printf("chear link list\n");
    link.head=DelLink(link.head,&link.length);
    Print(&link);
    printf("load link list\n");
    if (!(fp=fopen(path,"rb"))) {
        printf("error! open file!\n");
    }
    else link.head=LoadLink(&link,fp);
    Print(&link);
    printf("head=head->next\n");
    link.head=link.head->next;
    printf("%3d,%5.2f\n",link.head->fie.num,link.head->fie.score);
    printf("head=head->back\n");
    link.head=link.head->back;
    printf("%3d,%5.2f\n",link.head->fie.num,link.head->fie.score);
    getchar();
}

回复列表 (共3个回复)

沙发

代码输写风格让人不想看下去

板凳

注释写得还不错。

3 楼

我头都看晕了

我来回复

您尚未登录,请登录后再回复。点此登录或注册