设计一个算法,在一个单链表中值为y的结点前插入一个值为x的结点。 15

即使值为x的新结点成为y结点的前驱结点... 即使值为x的新结点成为y结点的前驱结点 展开
 我来答
百度网友edd6353bd
2009-03-12 · TA获得超过1162个赞
知道小有建树答主
回答量:2513
采纳率:0%
帮助的人:1424万
展开全部
以前写过!

#include<stdio.h>
#include <stdlib.h>
#include <math.h>

/************************************************************************/
/* 常量定义 */
/************************************************************************/
#define ElemType int
#define Status int
#define TRUE 1
#define OK 1
#define FALSE 0
#define ERROR -1

/************************************************************************/
/* 线性表的单链表存储结构*/
/************************************************************************/
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;

/************************************************************************/
/* 操作结果:构造一个空的线性表L */
/************************************************************************/
void InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
if( !*L ) /* 存储分配失败 */
exit(OVERFLOW);
(*L)->next = NULL; /* 指针域为空 */
}

/************************************************************************/
/* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */
/************************************************************************/
int ListLength(LinkList L)
{
int i = 0;
LinkList p = L->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
i++;
p = p->next;
}
return i;
}

/************************************************************************/
/* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)*/
/* 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
/************************************************************************/
int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{
int i = 0;
LinkList p = L->next;
while(p)
{
i++;
if(compare(p->data,e)) /* 找到这样的数据元素 */
return i;
p=p->next;
}
return 0;
}

/************************************************************************/
/* 在带头结点的单链线性表L中第i个位置之前插入元素e */
/************************************************************************/
Status ListInsert(LinkList L, int i, ElemType e)
{
int j = 0;
LinkList p = L, s;
while( p && j < i-1) /* 寻找第i-1个结点 */
{
p = p->next;
j++;
}
if( !p|| j > i-1) /* i小于1或者大于表长 */
return ERROR;
s = (LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
s->data = e; /* 插入L中 */
s->next = p->next;
p->next = s;
return OK;
}

/************************************************************************/
/* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
/************************************************************************/
Status ListDelete(LinkList L, int i, ElemType *e)
{
int j = 0;
LinkList p = L, q;
while(p->next && j < i-1) /* 寻找第i个结点,并令p指向其前岖 */
{
p = p->next;
j++;
}
if( !p->next || j > i-1) /* 删除位置不合理 */
return ERROR;
q = p->next; /* 删除并释放结点 */
p->next = q->next;
*e = q->data;
free(q);
return OK;
}

/************************************************************************/
/* 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi() */
/************************************************************************/
void ListTraverse(LinkList L, void(*vi)(ElemType))
{
LinkList p = L->next;
while(p)
{
vi(p->data);
p = p->next;
}
printf("\n");
}

//y之前插入data
void InPosInsert(LinkList L, ElemType y, ElemType data)
{
LinkList p,q,s;
p = L->next;
q = L;
while(p->data != y && p)
{
q = p;
p = p->next;
}

s = (LinkList) malloc(sizeof(LinkList));
s->data = data;

s->next = q->next;
q->next = s;
}

/************************************************************************/
/* 初始条件:线性表L已存在。打印链表的data域 */
/************************************************************************/
void ListPrint(LinkList L)
{
LinkList p = L->next;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

void printInt(int data)
{
printf("%d ", data);
}
void main()
{
LinkList L;
InitList(&L);
ListInsert(L, 1, 2);
ListInsert(L, 2, 3);
ListInsert(L, 3, 67);
ListInsert(L, 4, 6);
ListInsert(L, 5, 5);

//在5之前插入99
InPosInsert(L, 5, 99);
ListTraverse(L, printInt);
}
段石禾涵易
2019-12-25 · TA获得超过3923个赞
知道大有可为答主
回答量:3202
采纳率:27%
帮助的人:196万
展开全部
以前写过!
#include<stdio.h>
#include
<stdlib.h>
#include
<math.h>
/************************************************************************/
/*
常量定义
*/
/************************************************************************/
#define
ElemType
int
#define
Status
int
#define
TRUE
1
#define
OK
1
#define
FALSE
0
#define
ERROR
-1
/************************************************************************/
/*
线性表的单链表存储结构*/
/************************************************************************/
typedef
struct
LNode
{
ElemType
data;
struct
LNode
*next;
}LNode,
*LinkList;
/************************************************************************/
/*
操作结果:构造一个空的线性表L
*/
/************************************************************************/
void
InitList(LinkList
*L)
{
*L
=
(LinkList)malloc(sizeof(struct
LNode));
/*
产生头结点,并使L指向此头结点
*/
if(
!*L
)
/*
存储分配失败
*/
exit(OVERFLOW);
(*L)->next
=
NULL;
/*
指针域为空
*/
}
/************************************************************************/
/*
初始条件:线性表L已存在。操作结果:返回L中数据元素个数
*/
/************************************************************************/
int
ListLength(LinkList
L)
{
int
i
=
0;
LinkList
p
=
L->next;
/*
p指向第一个结点
*/
while(p)
/*
没到表尾
*/
{
i++;
p
=
p->next;
}
return
i;
}
/************************************************************************/
/*
初始条件:
线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)*/
/*
操作结果:
返回L中第1个与e满足关系compare()的数据元素的位序。
*/
/*
若这样的数据元素不存在,则返回值为0
*/
/************************************************************************/
int
LocateElem(LinkList
L,
ElemType
e,
Status(*compare)(ElemType,
ElemType))
{
int
i
=
0;
LinkList
p
=
L->next;
while(p)
{
i++;
if(compare(p->data,e))
/*
找到这样的数据元素
*/
return
i;
p=p->next;
}
return
0;
}
/************************************************************************/
/*
在带头结点的单链线性表L中第i个位置之前插入元素e
*/
/************************************************************************/
Status
ListInsert(LinkList
L,
int
i,
ElemType
e)
{
int
j
=
0;
LinkList
p
=
L,
s;
while(
p
&&
j
<
i-1)
/*
寻找第i-1个结点
*/
{
p
=
p->next;
j++;
}
if(
!p||
j
>
i-1)
/*
i小于1或者大于表长
*/
return
ERROR;
s
=
(LinkList)malloc(sizeof(struct
LNode));
/*
生成新结点
*/
s->data
=
e;
/*
插入L中
*/
s->next
=
p->next;
p->next
=
s;
return
OK;
}
/************************************************************************/
/*
在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
*/
/************************************************************************/
Status
ListDelete(LinkList
L,
int
i,
ElemType
*e)
{
int
j
=
0;
LinkList
p
=
L,
q;
while(p->next
&&
j
<
i-1)
/*
寻找第i个结点,并令p指向其前岖
*/
{
p
=
p->next;
j++;
}
if(
!p->next
||
j
>
i-1)
/*
删除位置不合理
*/
return
ERROR;
q
=
p->next;
/*
删除并释放结点
*/
p->next
=
q->next;
*e
=
q->data;
free(q);
return
OK;
}
/************************************************************************/
/*
初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi()
*/
/************************************************************************/
void
ListTraverse(LinkList
L,
void(*vi)(ElemType))
{
LinkList
p
=
L->next;
while(p)
{
vi(p->data);
p
=
p->next;
}
printf("\n");
}
//y之前插入data
void
InPosInsert(LinkList
L,
ElemType
y,
ElemType
data)
{
LinkList
p,q,s;
p
=
L->next;
q
=
L;
while(p->data
!=
y
&&
p)
{
q
=
p;
p
=
p->next;
}
s
=
(LinkList)
malloc(sizeof(LinkList));
s->data
=
data;
s->next
=
q->next;
q->next
=
s;
}
/************************************************************************/
/*
初始条件:线性表L已存在。打印链表的data域
*/
/************************************************************************/
void
ListPrint(LinkList
L)
{
LinkList
p
=
L->next;
while(p)
{
printf("%d
",
p->data);
p
=
p->next;
}
printf("\n");
}
void
printInt(int
data)
{
printf("%d
",
data);
}
void
main()
{
LinkList
L;
InitList(&L);
ListInsert(L,
1,
2);
ListInsert(L,
2,
3);
ListInsert(L,
3,
67);
ListInsert(L,
4,
6);
ListInsert(L,
5,
5);
//在5之前插入99
InPosInsert(L,
5,
99);
ListTraverse(L,
printInt);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式