用C语言编程:创建一个链表 并在该链表的任意位置实现添加和删除的功能,要求在同一个程序中完成!
1个回答
展开全部
以前给别人做的一个链表,给你用功能富裕了你看看吧:
#include
"stdio.h"
struct
Node
{
Node
*pNext;
int
value;
}*pTop;
struct
Node*
Insert(struct
Node
*pNode,int
Num);
void
Del(struct
Node
*pDelNode);
struct
Node*
Search(struct
Node
*pNode,int
Num);
void
main()
{
pTop=NULL;
int
i,k,x,y;
struct
Node
*pCurrentNode,*pTempNode;
/*(1)建立带表头结点的单链表;*/
for(i=0;i<30;i++)
Insert(NULL,i);/*建立一个有30个结点的链表*/
/*(2)输出单链表中所有结点的数据域值;*/
pCurrentNode=pTop;
while(pCurrentNode!=NULL)
{
printf("%d->",pCurrentNode->value);/*遍历这个链表并输出其各结点的数据域*/
pCurrentNode=pCurrentNode->pNext;
}
/*(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;*/
printf("Input
x,y");
scanf("%d,%d",&x,&y);
pCurrentNode=Search(NULL,x);
Insert(pCurrentNode,y);
/*(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。
*/
printf("Input
k");
scanf("%d",&k);
pCurrentNode=pTop;
i=0;
while(1)
{
pTempNode=Search(pCurrentNode,x);
if(pTempNode!=NULL)
{
pCurrentNode=pTempNode->pNext;
Del(pTempNode);
i++;
}
else
break;
}
printf("%d
Nodes
was
deleted",i);
pTempNode=pTop;
while(pTop!=NULL)
{
pTop=pTempNode->pNext;
delete
pTempNode;
}
}
Node*
Insert(struct
Node
*pNode,int
Num)
{
struct
Node
*pNewNode;
pNewNode=new
Node;
pNewNode->value=Num;
if(pNode==NULL)/*无确定插入位置时将结点放在链表最后*/
{
if(pTop!=NULL)/*确定链表是否是空表*/
{
pNode=pTop;
while(pNode->pNext!=NULL)
pNode=pNode->pNext;/*找到尾结点*/
pNode->pNext=pNewNode;
}
else
{
pTop=pNewNode;
}
pNewNode->pNext=NULL;
}
else/*有确定插入位置时将结点放在指定结点之后*/
{
pNewNode->pNext=pNode->pNext;
pNode->pNext=pNewNode;
}
return
pNewNode;
}
void
Del(struct
Node
*pDelNode)
{
if(pDelNode==NULL
||
pTop==NULL)
return;/*防错处理*/
struct
Node
*pNode;
pNode=pTop;
while(pNode!=NULL
&&
pNode->pNext!=pDelNode)
pNode=pNode->pNext;/*找到指定结点的前导结点*/
if(pNode!=NULL)
{
pNode->pNext=pDelNode->pNext;
delete
pDelNode;
}
}
struct
Node*
Search(struct
Node
*pNode,int
Num)
{
struct
Node
*pSeaNode;
if(pNode==NULL)
pSeaNode=pTop;/*不指定搜索的起始位置,从表头开始*/
else
pSeaNode=pNode;/*指定了搜索的起始位置,从指定位置开始*/
while(pSeaNode!=NULL
&&
pSeaNode->value!=Num)
pSeaNode=pSeaNode->pNext;
return
pSeaNode;/*没有找到结点时返回空指针*/
}
#include
"stdio.h"
struct
Node
{
Node
*pNext;
int
value;
}*pTop;
struct
Node*
Insert(struct
Node
*pNode,int
Num);
void
Del(struct
Node
*pDelNode);
struct
Node*
Search(struct
Node
*pNode,int
Num);
void
main()
{
pTop=NULL;
int
i,k,x,y;
struct
Node
*pCurrentNode,*pTempNode;
/*(1)建立带表头结点的单链表;*/
for(i=0;i<30;i++)
Insert(NULL,i);/*建立一个有30个结点的链表*/
/*(2)输出单链表中所有结点的数据域值;*/
pCurrentNode=pTop;
while(pCurrentNode!=NULL)
{
printf("%d->",pCurrentNode->value);/*遍历这个链表并输出其各结点的数据域*/
pCurrentNode=pCurrentNode->pNext;
}
/*(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;*/
printf("Input
x,y");
scanf("%d,%d",&x,&y);
pCurrentNode=Search(NULL,x);
Insert(pCurrentNode,y);
/*(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。
*/
printf("Input
k");
scanf("%d",&k);
pCurrentNode=pTop;
i=0;
while(1)
{
pTempNode=Search(pCurrentNode,x);
if(pTempNode!=NULL)
{
pCurrentNode=pTempNode->pNext;
Del(pTempNode);
i++;
}
else
break;
}
printf("%d
Nodes
was
deleted",i);
pTempNode=pTop;
while(pTop!=NULL)
{
pTop=pTempNode->pNext;
delete
pTempNode;
}
}
Node*
Insert(struct
Node
*pNode,int
Num)
{
struct
Node
*pNewNode;
pNewNode=new
Node;
pNewNode->value=Num;
if(pNode==NULL)/*无确定插入位置时将结点放在链表最后*/
{
if(pTop!=NULL)/*确定链表是否是空表*/
{
pNode=pTop;
while(pNode->pNext!=NULL)
pNode=pNode->pNext;/*找到尾结点*/
pNode->pNext=pNewNode;
}
else
{
pTop=pNewNode;
}
pNewNode->pNext=NULL;
}
else/*有确定插入位置时将结点放在指定结点之后*/
{
pNewNode->pNext=pNode->pNext;
pNode->pNext=pNewNode;
}
return
pNewNode;
}
void
Del(struct
Node
*pDelNode)
{
if(pDelNode==NULL
||
pTop==NULL)
return;/*防错处理*/
struct
Node
*pNode;
pNode=pTop;
while(pNode!=NULL
&&
pNode->pNext!=pDelNode)
pNode=pNode->pNext;/*找到指定结点的前导结点*/
if(pNode!=NULL)
{
pNode->pNext=pDelNode->pNext;
delete
pDelNode;
}
}
struct
Node*
Search(struct
Node
*pNode,int
Num)
{
struct
Node
*pSeaNode;
if(pNode==NULL)
pSeaNode=pTop;/*不指定搜索的起始位置,从表头开始*/
else
pSeaNode=pNode;/*指定了搜索的起始位置,从指定位置开始*/
while(pSeaNode!=NULL
&&
pSeaNode->value!=Num)
pSeaNode=pSeaNode->pNext;
return
pSeaNode;/*没有找到结点时返回空指针*/
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询