主页 > 人工智能  > 

数据结构-----双向链表

数据结构-----双向链表
一、双向循环列表

head.h

#ifndef __head_h__ #define __head_h__ #include <stdio.h> #include <string.h> #include <stdlib.h> enum { SUCCESS, FALSE=-1 }; typedef char datatype; //双向列表结构体 typedef struct Node { //存数据域 datatype data; //存上一个地址 struct Node *back; //存下一个地址 struct Node *next; }*Doublelink; //头插 Doublelink insert_head(datatype element,Doublelink head); //输出 void output_head(Doublelink head); //头删 Doublelink delete_head_link(Doublelink head); //尾插 Doublelink insert_back_link(Doublelink head,datatype element); //尾删 Doublelink delete_back_link(Doublelink head); #endif

main.c

#include "head.h" int main(int argc, const char *argv[]) { Doublelink head=NULL;//定义双向列表头节点 int n; printf("请输入n的值:"); scanf("%d",&n); datatype element; for(int i=0;i<n;i++) { printf("请输入%d个数的值:",i+1); getchar(); element=getchar(); head=insert_head(element,head); } //输出 output_head(head); //头删 printf("头删后的结果为:\n"); head=delete_head_link(head); output_head(head); //尾插 printf("请输入在末尾要插入的值:"); getchar(); element=getchar(); printf("尾插后的结果为:\n"); head=insert_back_link(head,element); output_head(head); //尾删 printf("尾删后的结果为:\n"); head=delete_back_link(head); output_head(head); return 0; }

test.c

#include "head.h" //创建节点 Doublelink create_node() { Doublelink s=(Doublelink)malloc(sizeof(struct Node)); if(NULL==s) return NULL; //新节点的数据域初始化 s->data=0; //指针域初始化 s->next=s->back=s; return s; } //头插 Doublelink insert_head(datatype element,Doublelink head) { //创建新节点 Doublelink s=create_node(); s->data=element; //链表为空 if(head==NULL) head=s; //存在至少一个节点 else { Doublelink rear=head->back; s->next=head; head->back=s; head=s; rear->next=head; head->back=rear; } return head; } //遍历(正向) void output_head(Doublelink head) { //链表为空 if(head==NULL) { printf("输出失败\n"); return; } else { Doublelink p=head; do { printf("%c ",p->data); p=p->next; }while(p!=head); putchar(10); } } //头删 Doublelink delete_head_link(Doublelink head) { //链表为空 if(head==NULL) { printf("删除失败\n"); return head; } else { Doublelink p=head; head=head->next; head->back=p->back; p->back->next=head; free(p); p=NULL; return head; } } //尾插 Doublelink insert_back_link(Doublelink head,datatype element) { Doublelink s=create_node(); s->data=element; if(head==NULL) head=s; Doublelink p=head; while(p->next!=head) { p=p->next; } p->next=s; s->next=head; s->back=p; head->back=s; return head; } //尾删 Doublelink delete_back_link(Doublelink head) { //判断为空 if(head==NULL) { printf("尾删失败\n"); return head; } Doublelink p=head->back; Doublelink q=p->back; q->next=head; head->back=q; free(p); p=NULL; return head; }

二、双向链表的尾删 //尾删 void delete_back_link(Doublelink head) { //判断为空 if(head==NULL) { printf("尾删失败\n"); return ; } Doublelink p=head; if(p->next==NULL) { head=delete_head_link(head); return; } while(p->next!=NULL) { p=p->next; } p->back->next=NULL; free(p); p=NULL; return ; }

标签:

数据结构-----双向链表由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“数据结构-----双向链表