#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;//将头结点的地址给p
char 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;//新的结点,内有元素ch
p = 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;
}
双链表操作
最新推荐文章于 2024-01-21 17:59:49 发布