双向链表的功能实现:初始化,插入,按位置插入,按位置删除,按值删除,遍历打印等
2017-05-21 22:05
686 查看
#include<stdio.h>
#include <stdlib.h>
#define F -1
typedef struct Node* node;
struct Node
{
node prior;
node next;
int value;
};
int init(node *head); //初始化
int insert_tail(node head, int element); // 尾插法
void printh(node head); // 从头开始遍历打印
void printt(node head); // 从尾开始遍历打印
int insert_head(node head, int element); // 头插法
int insert_index(node head, int element, int index); // 按位置插入
int length(node head); // 计算链表长度
int delete(node head, int element); // 删除结点
main()
{
int i;
node head;
init(&head);
for (i = 0; i < 10; i++)
{
insert_tail(head, i);
}
printh(head);
printt(head);
for (i = 0; i < 10; i++)
{
insert_head(head, i);
}
printh(head);
printt(head);
insert_index(head, 99, 5);
printh(head);
printt(head);
delete(head, 1);
printh(head);
printt(head);
}
int delete(node head, int element)
{
node t;
node temp = head;
while (temp->next != head)
{
if (temp->next->value == element)
{
t = temp->next->next;
t->prior = temp;
free(temp->next);
temp->next = t;
}
else
{
temp = temp->next;
}
}
return 0;
}
int length(node head)
{
node temp = head;
int count = 0;
while (temp->next != head)
{
count++;
temp = temp->next;
}
return count;
}
int insert_index(node head, int element, int index)
{
node temp = head;
node newnode = (node)malloc(sizeof(struct Node));
int i;
if (index < 0 || index > length(head))
printf("out of range");
for (i = 0; i < index; i++)
{
temp = temp->next;
}
newnode->value = element;
newnode->next = temp->next;
newnode->prior = temp;
temp->next->prior = newnode;
temp->next = newnode;
return 0;
}
int insert_head(node head, int element)
{
node newnode = (node)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
newnode->value = element;
newnode->prior = head;
newnode->next = head->next;
head->next->prior = newnode;
head->next = newnode;
return 0;
}
void printh(node head)
{
node temp = head;
while (temp->prior != head)
{
printf("%d ", temp->prior->value);
temp = temp->prior;
}
printf("\n");
}
void printt(node head)
{
node temp = head;
while (temp->next != head)
{
printf("%d ", temp->next->value);
temp = temp->next;
}
printf("\n");
}
int insert_tail(node head, int element)
{
node newnode = (node)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
newnode->value = element;
newnode->next = head;
head->prior->next = newnode;
newnode->prior = head->prior;
head->prior = newnode;
return 0;
}
int init(node *head)
{
node newnode = (node)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
newnode->value = 0;
newnode->prior = newnode;
newnode->next = newnode;
*head = newnode;
}
4000
#include <stdlib.h>
#define F -1
typedef struct Node* node;
struct Node
{
node prior;
node next;
int value;
};
int init(node *head); //初始化
int insert_tail(node head, int element); // 尾插法
void printh(node head); // 从头开始遍历打印
void printt(node head); // 从尾开始遍历打印
int insert_head(node head, int element); // 头插法
int insert_index(node head, int element, int index); // 按位置插入
int length(node head); // 计算链表长度
int delete(node head, int element); // 删除结点
main()
{
int i;
node head;
init(&head);
for (i = 0; i < 10; i++)
{
insert_tail(head, i);
}
printh(head);
printt(head);
for (i = 0; i < 10; i++)
{
insert_head(head, i);
}
printh(head);
printt(head);
insert_index(head, 99, 5);
printh(head);
printt(head);
delete(head, 1);
printh(head);
printt(head);
}
int delete(node head, int element)
{
node t;
node temp = head;
while (temp->next != head)
{
if (temp->next->value == element)
{
t = temp->next->next;
t->prior = temp;
free(temp->next);
temp->next = t;
}
else
{
temp = temp->next;
}
}
return 0;
}
int length(node head)
{
node temp = head;
int count = 0;
while (temp->next != head)
{
count++;
temp = temp->next;
}
return count;
}
int insert_index(node head, int element, int index)
{
node temp = head;
node newnode = (node)malloc(sizeof(struct Node));
int i;
if (index < 0 || index > length(head))
printf("out of range");
for (i = 0; i < index; i++)
{
temp = temp->next;
}
newnode->value = element;
newnode->next = temp->next;
newnode->prior = temp;
temp->next->prior = newnode;
temp->next = newnode;
return 0;
}
int insert_head(node head, int element)
{
node newnode = (node)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
newnode->value = element;
newnode->prior = head;
newnode->next = head->next;
head->next->prior = newnode;
head->next = newnode;
return 0;
}
void printh(node head)
{
node temp = head;
while (temp->prior != head)
{
printf("%d ", temp->prior->value);
temp = temp->prior;
}
printf("\n");
}
void printt(node head)
{
node temp = head;
while (temp->next != head)
{
printf("%d ", temp->next->value);
temp = temp->next;
}
printf("\n");
}
int insert_tail(node head, int element)
{
node newnode = (node)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
newnode->value = element;
newnode->next = head;
head->prior->next = newnode;
newnode->prior = head->prior;
head->prior = newnode;
return 0;
}
int init(node *head)
{
node newnode = (node)malloc(sizeof(struct Node));
if (NULL == newnode)
{
return F;
}
newnode->value = 0;
newnode->prior = newnode;
newnode->next = newnode;
*head = newnode;
}
4000
相关文章推荐
- 链表的初始化、遍历、删除、插入、判断是否为空、求长度 C语言实现
- c++ 实现双向链表构造函数,拷贝构造函数,析构函数,输出操作符重载,赋值操作符重载,头插尾插,头删尾删,任意位置插入,任意位置删除,查找等
- c++实现双向链表的建立,插入,删除,合并,打印
- 循环链表的初始化、插入、删除、返回结点位置、遍历
- 初始化链表 ,插入结点,删除结点,返回结点位置 ,遍历链表 。
- 实现双向链表的创建、测长、打印、插入、删除
- 利用模板类编写一个程序,实现双向链表的插入、删除、查找、显示的功能。
- 利用线性链表实现 初始化、插入数据、查看数据、删除数据、链表逆序、清除和销毁数据链表的功能
- 实现单链表创建、插入、删除、打印功能
- 单链表的游标实现:插入、删除、查找、打印等功能
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- 实现双向链表删除一个节点P,在节点P后插入一个节点
- C语言:动态链表的建立,查找,删除,插入功能的实现
- 双向链表的有关操作(创建,遍历,插入,删除)
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- 单循环链表的初始化、插入、删除、遍历、查找
- 二级指针实现单链表的插入、删除及 linux内核源码双向链表之奇技
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- 双向链表实现 插入删除
- C语言实现双向链表删除节点、插入节点、双向输出等操作