双向链表的增删改查
main.c
#include"head.h"
int main(int argc, const char* argv[])
{
pointer_DouLink_node head = create_DouLink_head();
int len;
int pos;
printf("请输入插入字符串的个数:");
scanf("%d", &len);
datatype data;
for(int i = 0; i<len; i++)
{
printf("请输入字符串(头插):");
scanf(" %s", data);
insert_DouLink_head(head, data);
}
output_DouLink(head);
for(int i = 0; i<len; i++)
{
printf("请输入字符串(尾插):");
scanf(" %s", data);
insert_DouLink_rear(head, data);
}
output_DouLink(head);
printf("头删一个结点\n");
delete_DouLink_head(head);
output_DouLink(head);
printf("尾删一个结点\n");
delete_DouLink_rear(head);
output_DouLink(head);
printf("请输入要插入的位置:");
scanf("%d", &pos);
printf("请输入字符串:");
scanf(" %s", data);
insert_DouLink_pos(head, pos, data);
output_DouLink(head);
printf("请输入要修改的位置:");
scanf("%d", &pos);
printf("请输入字符串:");
scanf(" %s", data);
update_DouLink_pos(head, pos, data);
output_DouLink(head);
printf("请输入要删除的位置:");
scanf("%d", &pos);
delete_DouLink_pos(head, pos);
output_DouLink(head);
printf("请输入要查找的位置:");
scanf("%d", &pos);
search_DouLink_pos(head, pos);
output_DouLink(head);
return 0;
}
fun.c
#include"head.h"
pointer_DouLink_node create_DouLink_head(void)
{
pointer_DouLink_node node = (pointer_DouLink_node)malloc(sizeof(struct Node));
if(NULL == node)
{
return NULL;
}
node->len = 0;
node->next = NULL;
node->prev = NULL;
return node;
}
pointer_DouLink_node create_DouLink_node(void)
{
pointer_DouLink_node node = (pointer_DouLink_node)malloc(sizeof(struct Node));
if(NULL == node)
{
return NULL;
}
strcpy(node->data, "");
node->next = NULL;
node->prev = NULL;
return node;
}
void output_DouLink(pointer_DouLink_node head)
{
if(NULL == head || 0 == head->len)
{
return;
}
pointer_DouLink_node p = head;
while(NULL != p->next)
{
p = p->next;
printf("%s\t", p->data);
}
printf("\n");
while(NULL != p->prev)
{
printf("%s\t", p->data);
p = p->prev;
}
printf("\n");
}
int insert_DouLink_head(pointer_DouLink_node head, datatype data)
{
pointer_DouLink_node node_new = create_DouLink_node();
if(NULL == node_new)
{
return -1;
}
strcpy(node_new->data, data);
node_new->prev = head;
node_new->next = head->next;
if (head->next != NULL)
{
head->next->prev = node_new;
}
head->next = node_new;
head->len++;
return 0;
}
int insert_DouLink_rear(pointer_DouLink_node head, datatype data)
{
pointer_DouLink_node node_new = create_DouLink_node();
if(NULL == node_new || NULL == head)
{
return -1;
}
pointer_DouLink_node p = head;
while(NULL!=p->next)
{
p = p->next;
}
strcpy(node_new->data, data);
node_new->prev = p;
p->next = node_new;
head->len++;
return 0;
}
int delete_DouLink_head(pointer_DouLink_node head)
{
if(0 == head->len || NULL == head)
{
printf("删除失败\n");
return -1;
}
pointer_DouLink_node p = head->next;
head->next = p->next;
if(p->next != NULL)
{
p->next->prev = head;
}
free(p);
p = NULL;
head->len--;
return 0;
}
int delete_DouLink_rear(pointer_DouLink_node head)
{
if(0 == head->len || NULL == head)
{
printf("删除失败\n");
return -1;
}
pointer_DouLink_node p = head;
while(NULL != p->next->next)
{
p = p->next;
}
free(p->next);
p->next = NULL;
head->len--;
return 0;
}
int insert_DouLink_pos(pointer_DouLink_node head, int pos, datatype data)
{
if(NULL == head || pos<1 || pos>head->len+1)
{
printf("插入失败!\n");
return -1;
}
pointer_DouLink_node p = head;
for(int i = 0; i<pos-1; i++)
{
p = p->next;
}
pointer_DouLink_node newnode = create_DouLink_node();
if(NULL == newnode)
{
return -1;
}
strcpy(newnode->data, data);
newnode->prev = p;
newnode->next = p->next;
if(NULL != p->next)
{
p->next->prev = newnode;
}
p->next = newnode;
head->len++;
return 0;
}
int update_DouLink_pos(pointer_DouLink_node head, int pos, datatype data)
{
if(NULL == head || pos<1 || pos>head->len)
{
printf("修改失败!\n");
return -1;
}
pointer_DouLink_node p = head;
for(int i = 0; i<pos; i++)
{
p = p->next;
}
strcpy(p->data, data);
return 0;
}
int delete_DouLink_pos(pointer_DouLink_node head, int pos)
{
if(NULL == head || pos<1 || pos>head->len)
{
printf("删除失败\n");
return -1;
}
pointer_DouLink_node p = head;
for(int i = 0; i<pos-1; i++)
{
p = p->next;
}
pointer_DouLink_node del = p->next;
p->next = del->next;
if(NULL != del->next)
del->next->prev = p;
free(del);
head->len--;
}
int search_DouLink_pos(pointer_DouLink_node head, int pos)
{
if(NULL == head || pos<1 || pos>head->len)
{
printf("查找失败\n");
return -1;
}
pointer_DouLink_node p = head;
for(int i = 0; i<pos; i++)
{
p = p->next;
}
printf("您要查找的是:%s\n", p->data);
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 7
typedef char datatype[20];
typedef struct Node
{
union
{
datatype data;
int len;
};
struct Node* next;
struct Node* prev;
} * pointer_DouLink_node;
pointer_DouLink_node create_DouLink_head(void);
pointer_DouLink_node create_DouLink_node(void);
void output_DouLink(pointer_DouLink_node head);
int insert_DouLink_head(pointer_DouLink_node head, datatype data);
int insert_DouLink_rear(pointer_DouLink_node head, datatype data);
int delete_DouLink_head(pointer_DouLink_node head);
int delete_DouLink_rear(pointer_DouLink_node head);
int insert_DouLink_pos(pointer_DouLink_node head, int pos, datatype data);
int update_DouLink_pos(pointer_DouLink_node head, int pos, datatype data);
int delete_DouLink_pos(pointer_DouLink_node head, int pos);
int search_DouLink_pos(pointer_DouLink_node head, int pos);
#endif