双链表操作

来源:互联网 发布:股票数据接口api 编辑:程序博客网 时间:2024/06/18 09:13
#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct dnode{char data;struct dnode *prior;struct dnode *next;}dLinkList;//创建双链表,包括没有数据Data的头结点dLinkList* create_link(){dLinkList *p,*q;dLinkList* list = (dLinkList*)malloc(sizeof(dLinkList));(list)->data = '\0';(list)->prior = NULL;(list)->next = NULL;p = list;//将头结点的地址给pchar ch;printf("input element:");while((ch = getchar())!='\n')//ch = getchar(){q = (dLinkList*)malloc(sizeof(dLinkList));q->data = ch;q->next = NULL;q->prior = p;p->next = q;p = q;}return list;}//查找:根据位置查找结点,查找位置为n处的结点并返回指针dLinkList *find_by_pos(dLinkList *list,int n){dLinkList *p = list->next;int i=1;while(p && i<n){p=p->next;i++;}if(p==NULL || i>n){printf("find error!\n");return NULL;}return p;}//查找:根据数据元素查找,查找数据元素为ch的结点并返回指针dLinkList *find_by_val(dLinkList *list,char ch){dLinkList *p = list->next;while(p && p->data!=ch){p = p->next;}if(p == NULL){printf("find error!\n");return NULL;}return p;}//插入结点:在链表list位置n处插入元素void insert_val(dLinkList *list,int n,char ch){dLinkList *p;//链表位置n处的结点dLinkList *q;//新的结点,内有元素chp = find_by_pos(list,n);if(p == NULL){printf("insert error!\n");return;}q = (dLinkList*)malloc(sizeof(dLinkList));q->data = ch;q->prior = p->prior;p->prior->next = q;q->next = p;p->prior = q;}//删除结点:删除链表list位置n处的结点void delete_list(dLinkList *list,int n){dLinkList *p,*q;p = find_by_pos(list,n);q = p->prior;if(p==NULL || q==NULL){printf("delete error!\n");return;}q->next = p->next;p->next->prior = q;free(p);}//遍历链表void traverse_list(dLinkList *list){dLinkList *p = list->next;if(p==NULL){printf("no elements\n");}while(p!=NULL){printf("%c",p->data);p = p->next;}printf("\n");}int main(){dLinkList *list,*p;list = create_link();traverse_list(list);//查找:按位置p = find_by_pos(list,5);printf("position 5 elements:%c\n",p->data);//查找:按数据元素p = find_by_val(list,'r');if(p){printf("f element:%c\n",p->data);}//插入结点insert_val(list,5,'Q');traverse_list(list);//删除结点delete_list(list,3);traverse_list(list);system("pause");return 0;}