1.请编程实现双向链表的头插,头删,尾插,尾删
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Node
{
datatype data;
struct Node* next;
struct Node* front;
} *DoubleLink;
DoubleLink create_node()
{
DoubleLink node = (DoubleLink)malloc(sizeof(struct Node));
if (NULL == node)
{
return NULL;
}
node->next = NULL;
node->front = NULL;
return node;
}
DoubleLink head_insert(DoubleLink head, datatype element)
{
DoubleLink p = create_node();
if (NULL == p)
{
puts("头插:头插失败");
return head;
}
printf("头插:%d\n", element);
p->data = element;
if (NULL == head)
{
head = p;
}
else
{
p->next = head;
head->front = p;
head = p;
}
return head;
}
DoubleLink head_delete(DoubleLink head)
{
if (NULL == head)
{
puts("头删:空链表");
return NULL;
}
if (NULL == head->next)
{
printf("头删:%d\n", head->data);
free(head);
head = NULL;
return head;
}
DoubleLink p = head;
head = head->next;
head->front = NULL;
printf("头删:%d\n", p->data);
free(p);
p = NULL;
return head;
}
DoubleLink tail_insert(DoubleLink head, datatype element)
{
DoubleLink p = create_node();
if (NULL == p)
{
puts("尾插:尾插失败");
return head;
}
printf("尾插:%d\n", element);
p->data = element;
if (NULL == head)
{
head = p;
return head;
}
DoubleLink q = head;
while (q->next != NULL)
{
q = q->next;
}
q->next = p;
p->front = q;
return head;
}
DoubleLink tail_delete(DoubleLink head)
{
if (NULL == head)
{
puts("尾删:空链表");
return NULL;
}
if (NULL == head->next)
{
printf("尾删:%d\n", head->data);
free(head);
head = NULL;
return head;
}
DoubleLink p = head;
while (p->next != NULL)
{
p = p->next;
}
DoubleLink q = p->front;
q->next = NULL;
printf("尾删:%d\n", p->data);
free(p);
p = NULL;
return head;
}
void show(DoubleLink head)
{
if (NULL == head)
{
puts("空链表");
return;
}
DoubleLink p = head;
printf("展示:");
while (NULL != p)
{
printf("%2d", p->data);
p = p->next;
}
puts("");
}
int main()
{
int n = 5;
DoubleLink head = NULL;
for (int i = 0; i < n; i++)
{
head = head_insert(head, i);
}
show(head);
for (int i = 0; i < n; i++)
{
head = tail_insert(head, i);
}
show(head);
head = head_delete(head);
head = tail_delete(head);
show(head);
return 0;
}

2.请编程实现双向链表按任意位置插入,删除,修改,查找
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Node
{
datatype data;
struct Node* next;
struct Node* front;
} *DoubleLink;
DoubleLink create_node()
{
DoubleLink node = (DoubleLink)malloc(sizeof(struct Node));
if (NULL == node)
{
return NULL;
}
node->next = NULL;
node->front = NULL;
return node;
}
DoubleLink head_insert(DoubleLink head, datatype element)
{
DoubleLink p = create_node();
if (NULL == p)
{
puts("头插:头插失败");
return head;
}
printf("头插:%d\n", element);
p->data = element;
if (NULL == head)
{
head = p;
}
else
{
p->next = head;
head->front = p;
head = p;
}
return head;
}
DoubleLink head_delete(DoubleLink head)
{
if (NULL == head)
{
puts("头删:空链表");
return NULL;
}
if (NULL == head->next)
{
printf("头删:%d\n", head->data);
free(head);
head = NULL;
return head;
}
DoubleLink p = head;
head = head->next;
head->front = NULL;
printf("头删:%d\n", p->data);
free(p);
p = NULL;
return head;
}
DoubleLink tail_insert(DoubleLink head, datatype element)
{
DoubleLink p = create_node();
if (NULL == p)
{
puts("尾插:尾插失败");
return head;
}
printf("尾插:%d\n", element);
p->data = element;
if (NULL == head)
{
head = p;
return head;
}
DoubleLink q = head;
while (q->next != NULL)
{
q = q->next;
}
q->next = p;
p->front = q;
return head;
}
DoubleLink tail_delete(DoubleLink head)
{
if (NULL == head)
{
puts("尾删:空链表");
return NULL;
}
if (NULL == head->next)
{
printf("尾删:%d\n", head->data);
free(head);
head = NULL;
return head;
}
DoubleLink p = head;
while (p->next != NULL)
{
p = p->next;
}
DoubleLink q = p->front;
q->next = NULL;
printf("尾删:%d\n", p->data);
free(p);
p = NULL;
return head;
}
void show(DoubleLink head)
{
if (NULL == head)
{
puts("空链表");
return;
}
DoubleLink p = head;
printf("展示:");
while (NULL != p)
{
printf("%2d", p->data);
p = p->next;
}
puts("");
}
int get_length(DoubleLink head)
{
if (NULL == head)
{
return 0;
}
int i = 0;
while (head != NULL)
{
head = head->next;
i++;
}
return i;
}
DoubleLink index_insert(DoubleLink head, int index, datatype element)
{
DoubleLink p = create_node();
if (NULL == p)
{
puts("按位置插入:初始化内存失败");
return head;
}
int n = get_length(head);
if (index < 1 || index > n)
{
puts("按位置插入:位置不合法");
return head;
}
printf("按位置插入:在 %d 位插入元素 %d\n", index, element);
p->data = element;
if (1 == index)
{
p->next = head;
head->front = p;
head = p;
return head;
}
DoubleLink q = head;
for (int i = 1; i < index - 1; i++)
{
q = q->next;
}
p->next = q->next;
p->next->front = p;
q->next = p;
p->front = q;
return head;
}
DoubleLink index_delete(DoubleLink head, int index)
{
if (NULL == head)
{
puts("按位置删除:空链表");
return head;
}
int n = get_length(head);
if (index < 1 || index > n)
{
puts("按位置删除:位置不合法");
return head;
}
if (1 == index)
{
DoubleLink p = head;
head = head->next;
head->front = NULL;
printf("按位置删除:在 %d 位删除元素 %d\n", index, p->data);
free(p);
p = NULL;
return head;
}
DoubleLink p = head;
for (int i = 1; i < index - 1; i++)
{
p = p->next;
}
DoubleLink q = p->next;
p->next = q->next;
q->next->front = p;
printf("按位置删除:在 %d 位删除元素 %d\n", index, q->data);
free(q);
q = NULL;
return head;
}
DoubleLink index_select(DoubleLink head, int index)
{
if (NULL == head)
{
puts("按位置查找:空链表");
return head;
}
int n = get_length(head);
if (index < 1 || index > n)
{
puts("按位置查找:位置不合法");
return head;
}
if (1 == index)
{
printf("按位置查找:在 %d 位的元素是 %d\n", index, head->data);
return head;
}
DoubleLink p = head;
for (int i = 1; i < index; i++)
{
p = p->next;
}
printf("按位置查找:在 %d 位的元素是 %d\n", index, p->data);
return head;
}
DoubleLink index_change(DoubleLink head, int index, datatype element)
{
if (NULL == head)
{
puts("按位置查找:空链表");
return head;
}
int n = get_length(head);
if (index < 1 || index > n)
{
puts("按位置查找:位置不合法");
return head;
}
if (1 == index)
{
printf("按位置修改:在 %d 位元素 %d 修改为 %d\n", index, head->data, element);
head->data = element;
return head;
}
DoubleLink p = head;
for (int i = 1; i < index; i++)
{
p = p->next;
}
printf("按位置修改:在 %d 位元素 %d 修改为 %d\n", index, p->data, element);
p->data = element;
return head;
}
int main()
{
int n = 5;
DoubleLink head = NULL;
for (int i = 0; i < n; i++)
{
head = head_insert(head, i);
}
show(head);
for (int i = 0; i < n; i++)
{
head = tail_insert(head, i);
}
show(head);
head = index_insert(head, 6, 6);
show(head);
head = index_delete(head, 9);
show(head);
head = index_select(head, 8);
head = index_change(head, 8, 8);
show(head);
return 0;
}

3.请简述栈和队列的区别
栈:只允许在表尾进行插入和删除,先进后出,后进先出
队列:只允许在表头删除,在表尾插入,先进先出,后进后出
4.请简述什么是内存泄漏
在程序中有已动态分配的堆内存由于某种原因未被释放或者无法释放,造成系统内存的浪费
本文详细介绍了如何用C语言实现双向链表的头插、头删、尾插、尾删以及在任意位置插入、删除、修改和查找功能。同时,对比了栈和队列的基本概念,以及解释了内存泄漏的概念和影响。
227

被折叠的 条评论
为什么被折叠?



