1 drink.h
#ifndef _DLINK_H
#define _DLINK_H
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* pior;
struct node* next;
}NODE,*linknode;
/*
struct node
{
int data;
struct node* pior;
struct node* next;
}
typedef struct node NODE
typedef struct node* linknode
*/
linknode createLinknode();
linknode insertLinknode(linknode head,linknode p);
void insertLinknode_h(linknode *head,linknode p);
linknode deleteLinknode(linknode head,int data);
linknode deleteLinknode_l(linknode head,int data);
void showLinknode(linknode head);
void freeLinknode(linknode head);
int lengthLinknode(linknode head);
linknode searchLinknode(linknode head,int data);
int saveLinknode(linknode head);
linknode readLinknode();
#endif
2 drink.c
#include"dlink.h"
linknode readLinknode()
{
FILE *fp=fopen("linknode.txt","r");
linknode p=NULL,head=NULL,tail;
int ret=0;
while(!feof(fp))
{
p=(linknode)malloc(sizeof(NODE));
ret=fscanf(fp,"%d\n",&p->data);
p->next=NULL;
p->pior=NULL;
if(ret==0)
break;
if(head==NULL)
{
head=p;
tail=p;
}
else
{
tail->next=p;
p->pior=tail;
tail=p;
}
}
fclose(fp);
return head;
}
linknode createLinknode()
{
linknode p=(linknode)malloc(sizeof(NODE));
if(p==NULL)
{
printf("申请空间失败\n");
return NULL;
}
printf("输入数据:\n");
scanf("%d",&p->data);
p->next=NULL;
p->pior=NULL;
return p;
}
void insertLinknode_h(linknode* head,linknode s)
{
if(*head==NULL)
{
*head=s;
return ;
}
s->next=*head;
(*head)->pior=s;
*head=s;
return ;
}
linknode insertLinknode(linknode head,linknode p)
{
linknode tail=head;
if(head==NULL)
{
head=p;
return head;
}
while(tail->next!=NULL)
{
tail=tail->next;
}
tail->next=p;
p->pior=tail;
return head;
}
linknode deleteLinknode(linknode head,int data)
{
linknode p=head;
if(head==NULL)
return NULL;
while(p!=NULL)
{
if(p->data==data)
{
if(p==head)
{
head=head->next;
if(head!=NULL)
head->pior=NULL;
else
{
free(p);
return NULL;
}
free(p);
break;
}
else
{
p->pior->next=p->next;
if(p->next!=NULL)
p->next->pior=p->pior;
free(p);
break;
}
}
p=p->next;
}
if(p==NULL)
printf("没有删除的数据\n");
return head;
}
linknode deleteLinknode_l(linknode head,int data)
{
if(head==NULL)
return NULL;
linknode s=(linknode)malloc(sizeof(NODE));
linknode p=head;
s->pior=NULL;
s->next=head;
head->pior=s;
head=s;
while(p!=NULL)
{
if(p->data==data)
{
p->pior->next=p->next;
if(p->next!=NULL)
p->next->pior=p->pior;
free(p);
break;
}
p=p->next;
}
if(p==NULL)
printf("没有删除的数据\n");
p=head;
head=head->next;
if(head!=NULL)
head->pior=NULL;
free(p);
return head;
}
void showLinknode(linknode head)
{
linknode p=head;
linknode tail;
if(head==NULL)
{
printf("空链表\n");
return ;
}
printf("从前到后遍历链表:\n");
while(p!=NULL)
{
printf("%-4d",p->data);
if(p->next==NULL)
tail=p;
p=p->next;
}
printf("\n从后到前遍历链表:\n");
while(tail!=NULL)
{
printf("%-4d",tail->data);
tail=tail->pior;
}
printf("\n");
}
int lengthLinknode(linknode head)
{
linknode p=head;
int length=0;
if(head==0)
return length;
while(p!=NULL)
{
length++;
p=p->next;
}
return length;
}
linknode searchLinknode(linknode head,int data)
{
linknode p=head;
if(head==NULL)
return NULL;
while(p!=NULL)
{
if(p->data==data)
return p;
p=p->next;
}
if(p==NULL)
return NULL;
}
void freeLinknode(linknode head)
{
linknode p=head;
if(head==NULL)
return;
while(p!=NULL)
{
head=head->next;
free(p);
p=head;
}
}
3 savelink.c
#include"dlink.h"
int saveLinknode(linknode head)
{
if(head==NULL)
{
printf("空链表\n");
return -2;
}
FILE *fp;
fp=fopen("linknode.txt","w+");
if(fp==NULL)
{
printf("文件打开失败\n");
return -1;
}
linknode p=head;
while(p!=NULL)
{
fprintf(fp,"%-4d\n",p->data);
p=p->next;
}
fclose(fp);
return 0;
}
4 main
#include"dlink.h"
int main()
{
linknode head=NULL;
linknode p=NULL;
int id,data,length,ret;
/*
for(;;)
{
p=createLinknode();
if(p==NULL)
{
printf("添加失败\n");
continue;
}
if(p->data==0)
{
free(p);
break;
}
insertLinknode_h(&head,p);
// printf("是否继续输入(0:退出):");
// scanf("%d",&i);
// if(i==0)
// break;
//printf("链表的第%d个结点\n",id);
}
*/
head=readLinknode();
showLinknode(head);
if((ret=saveLinknode(head))<0)
printf("文件保存失败\n");
length=lengthLinknode(head);
printf("链表长度length=%d\n",length);
printf("输入查找的数据:");
scanf("%d",&data);
p=searchLinknode(head,data);
if(p==NULL)
printf("没有找到数据\n");
else
printf("查找的数据data=%d\n",p->data);
printf("输入删除的数据:");
scanf("%d",&data);
head=deleteLinknode(head,data);
showLinknode(head);
freeLinknode(head);
}