主题:[原创]一个简单的双向链表
#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();
}
#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();
}