科目 | 内容 | 补充 | 时间 |
---|---|---|---|
数学 | 第一章题型三:确定极限式中的参数;题型四:无穷小量比阶;第三节 连续:讨论连续性性及间断点 | 70、142、146、147 |
1.设计一个递归算法,删除不带头结点的单链表L中所有的值为x的节点
//1.设计一个递归算法,删除不带头结点的单链表L中所有的值为x的节点
#include <malloc.h>
#include <stddef.h>
#include <stdio.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
bool InitList(LinkList &L)
{
L = NULL;
return true;
}
LinkList List_TailInsert(LinkList &L)
{
int x;
L = NULL;
LNode *s, *r;
s = r = NULL;
scanf("%d", &x);
while (x != 9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = NULL;
if (L == NULL)
{
L = s;
r = s;
}
else
{
r->next = s;
r = s;
}
scanf("%d", &x);
}
return L;
}
void printlist(LinkList L)
{
LNode *t;
t = L;
while (t != NULL)
{
printf("%d", t->data);
t = t->next;
}
}
void Delete_x_recursion(LinkList &L, int x)
{
if (L == NULL)//合法性判断
return;//跳出
if (L->data != x)//如果不等于x
{
Delete_x_recursion(L->next, x);//下一个节点
return;
}
LNode *p;//p指向待删除节点
p = L;
L = L->next;
free(p);
Delete_x_recursion(L, x);
}
int main(void)
{
LNode *L;
InitList(L);
printf("输入字符");
List_TailInsert(L);
printlist(L);
Delete_x(L, 2);
printf("________");
printlist(L);
return 0;
}
2.在带头结点的单链表L中,删除所有值为x的节点,并释放其空间,假设值为x的节点不唯一,试编写算法以实现上述操作
#include <malloc.h>
#include <stddef.h>
#include <stdio.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
bool InitList(LinkList &L)
{
L->next = NULL;
return true;
}
LinkList List_TailInsert(LinkList &L)
{
int x;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
LNode *s, *r ;
r = L;
scanf("%d", &x);
while (x != 9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
r->next = NULL;
scanf("%d", &x);
}
return L;
}
void printlist(LinkList L)
{
LNode *t;
t = L->next;
while (t != NULL)
{
printf("%d", t->data);
t = t->next;
}
}
void Delete_x(LinkList &L, int x)
{
if (L == NULL)
return;
LNode *p, *q, *pre;
pre = L;
p = L->next;
q = p;
while (q != NULL)
{
if (p->data != x)
{
p = p->next;
q = q->next;
pre = pre->next;
}
else
{
q = q->next;
pre->next = p->next;
free(p);
p = q;
}
}
}
int main(void)
{
LNode *L;
InitList(L);
printf("输入字符");
List_TailInsert(L);
printlist(L);
Delete_x(L, 2);
printf("________");
printlist(L);
return 0;
}
注意创立链表的时候,尾结点的next指针一定要指向NULL,否则打印函数无限循环