链表 按要求创建和删除指定位置节点问题
typedef int elemType;
typedef struct ListNode {
int element;
struct ListNode *next;
} Node;
/*
TODO:创建单链表
功能:补全代码,完成创建单链表的功能,前台录入一串数据,用空格隔开,输入0后,按回车完成输入。
如果输入数字小于 0,提示:"输入数据非法,建立链表停止\n";单链表创建成功提示:"链表创建成功\n"
如录入:1 2 3 4 5 6 7 8 9 10 0,回车,创建成功的链表为 1 2 3 4 5 6 7 8 9 10
参数:Node *pNode 是需要操作的单链表
返回值:链表创建成功返回链表,链表创建失败则返回null。
*/
Node *creatList(Node *head) //尾插法;
{
Node *p,*r;
head=(Node *)malloc(sizeof(Node)) ;
r=head;
int n;
while(1)
{
scanf("%d",&n);
if(n<0)
{
printf("输入数据非法,建立链表停止\n");
return NULL;
}
else if(n>0)
{
p=(Node *)malloc(sizeof(Node));
p->element=n;
head->next=p;
head=p;
}
else {
break;
}
}
head->next=NULL;
printf( "链表创建成功\n") ;
return r->next;
}
/*
新TODO: 删除pos位置的节点
功能:删除pos位置的节点,删除成功提示"删除pos=%d位置元素成功\n"
* 如果pos值大于链表长度,或者小于0,删除失败提示("输入pos值非法,删除节点失败\n")
删除成功之后,所有节点前提一位,如:1 2 3 4 5,pos = 3,
删除后,链表为:1 2 4 5。
参数:Node 是需要操作的单链表,pos是选择节点在链表中的位置
返回值:删除成功返回链表pNode,删除失败返回Null。
*/
Node *deletePosElement(Node *pNode, int pos){ // 双指针
int i = 1;
Node *pMove;
Node *pMovePre;
pMovePre = pNode; // 指向首节点;
pMove = pNode->next; //指向首节点的下一个;
if (pos==0)
{
printf("函数执行,在pos=%d位置删除节点成功\n",pos) ;
return pNode->next;
}
while (pMove != NULL) {
if (i == pos) {
pMovePre->next = pMove->next;
free(pMove);
printf("函数执行,在pos=%d位置删除节点成功\n",pos) ;
return pNode;
}
i++;
pMovePre = pMovePre->next;
pMove = pMove->next;
}
printf("输入pos值非法,删除节点失败\n");
return NULL;
}
调用;
void main() {
Node *pList = NULL; // 申请一个指针 ;
int item;
for (;;) // 无限循环,选择0 退出;
{
switch (menu_select()) // 调用菜单函数,按返回值选择功能函数
{
case 1:
printf("请输入单链表节点(大于0的整数):\n");
pList = creatList(pList);
break;
case 2:
printf("单链表的删除\n");
printf("请输入要删除的标的元素item:");
scanf("%d", &item);
// 删除顺序表中值为item的元素的函数调用;
pList = deletePosElement(pList, item);
break;
case 3:
printf("单链表的输出\n"); //输出通讯者信息的函数调用
printList(pList); // 输出函数;
break;
case 0:
printf("再见!\n");
return;
}
}
}
上述的函数的功能实现了吗?
希望大佬解释哪儿有问题, 帮忙指出来
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论