//双链表的C语言实现
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//双链表的结点结构
typedef struct _DOUBLE_LINK_NODE{
int data;
struct _DOUBLE_LINK_NODE *prev;
struct _DOUBLE_LINK_NODE *next;
}DOUBLE_LINK_NODE;
//创建空的循环双链表,带表头结点
DOUBLE_LINK_NODE *create_double_link_node(int value){
DOUBLE_LINK_NODE *doubleNode;
doubleNode=(DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE));
if(doubleNode!=NULL)
printf("创建成功!\n");
doubleNode->prev=doubleNode;
doubleNode->next=doubleNode;
doubleNode->data=value;
return doubleNode;
}
//创建长度为length(不算上表头)的双向链表,value为表头数据,length为除了表头以外的长度
DOUBLE_LINK_NODE *create_double_link_length(int value,int length){
DOUBLE_LINK_NODE *head,*pnew,*s;
int data;
head=(DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE));
if(head!=NULL){
printf("创建成功!\n");
}
pnew=head;
while(length>0){
s=(DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE));
printf("please input the data : ");
scanf("%d",&data);
s->data=data;
pnew->next=s;
s->prev=pnew;
pnew=s;
length--;
}
pnew->next=NULL;
head->prev=NULL;
head->data=value;
return head;
}
//获取双链表长度
int Length(DOUBLE_LINK_NODE *head){
DOUBLE_LINK_NODE *pnew;
pnew=head;
int n=0;
while(pnew!=NULL){
pnew=pnew->next;
n++;
}
printf("the length of double_link_node is : %d",n);
printf("\n");
return n;
}
//打印双向链表
void Printf(DOUBLE_LINK_NODE *head){
DOUBLE_LINK_NODE *pnew;
pnew=head;
printf("The data of list is : ");
while(pnew!=NULL){
printf(" %d ",pnew->data);
pnew=pnew->next;
}
printf("\n");
}
//插入数据到双链表中的指定位置
DOUBLE_LINK_NODE *Insert(DOUBLE_LINK_NODE *head,int location,int value){
DOUBLE_LINK_NODE *pnew,*s,*t;
pnew=head;
s=(DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE));
s->data=value;
int i=0;
if(location<1){
printf("插入位置有误!");
return;
}
for(i=0;i<location-1;i++){
pnew=pnew->next;
}
t=pnew->next;
pnew->next=s;
s->prev=pnew;
s->next=t;
t->prev=s;
return head;
}
//删除双链表中指定位置的数据 ,表头的位置为0
DOUBLE_LINK_NODE *delete(DOUBLE_LINK_NODE *head,int location){
DOUBLE_LINK_NODE *pnew,*t,*s;
pnew=head;
int i=0,length=0;
length=Length(head);
if(location<1||location>length){
printf("删除位置有误!");
return head;
}
if(pnew->next==NULL){
return head;
}
for(i=0;i<location;i++){
pnew=pnew->next;
}
t=pnew->next;
s=pnew->prev;
if(t==NULL){
s->next=NULL;
return head;
}
else{
s->next=t;
t->prev=s;
return head;
}
}
int main(int argc, char *argv[]) {
int length;
DOUBLE_LINK_NODE *doubleLink;
doubleLink=create_double_link_length(-1,5);
length=Length(doubleLink);
Printf(doubleLink);
doubleLink=Insert(doubleLink,3,10);
printf("after insert data to list,\n");
length=Length(doubleLink);
Printf(doubleLink);
doubleLink=delete(doubleLink,4);
printf("after delete data in list,\n");
Printf(doubleLink);
return 0;
}
双链表的C语言实现
最新推荐文章于 2024-04-20 21:28:50 发布