C语言链表增加删除节点问题

实现一个单向链表,要求:

1 对下表中的记录进行手工输入,并在输入完毕后,回显全部记录;

2 接受键盘输入:B,删除姓名为 B的记录,并打印链表中的所有记录。

Name

ID

Score

A

01234

98

B

01237

97

C

01236

65

#include <stdio.h> //包含的一些头文件

#include <stdlib.h>

#include <string.h>

struct mess//定义所需要的信息封装在结构体当中

{

char name[100];

int id;

int score;

};

typedef struct list_Node//创建专属链表结构体

{

struct mess person;

struct list_Node *next;

}list;

list *CreateEmptylist()//创建空链表

{

list *p = (list *)malloc(sizeof(list));//分配堆空间内存

memset(p->person.name, '\0', sizeof(p->person.name));//将p->person.name进行初始化

p->person.id = 0;//将id进行初始化

p->person.score = 0;//将分数进行初始化

p->next = NULL;//指针域置空

return p;//返回创建空链表的地址

}

void insertList(list *p, char *ScanfName, int ScanfId, int ScanfScore)//增加节点(形式参数信息)(尾插法)

{

list *q = malloc(sizeof(list));//创建新节点

strcpy(q->person.name, ScanfName);//给新节点进行赋值姓名信息

q->person.id = ScanfId;//给新节点进行赋值id信息

q->person.score = ScanfScore;//给新节点赋值分数信息

if(p->next == NULL)//如果链表是只有一个头节点时

{

p->next = q;//连接到头节点后

p = q;

}

else//如果链表除头节点外有其他头节点的话

{

while(p->next != NULL)//通过循环到最后一个节点

p = p->next;

p->next = q;//与新结点进行连接

p = q;

q->next = NULL;

}

}

void deleteListNode(list *p, char *ScanfName)//删除节点(包含的形式参数)

{

    if (strcmp(ScanfName, p->person.name) == 0) {//判断用户输入的是否为第一个节点的数据

        list *q = p;//如果是,进行节点删除

        p = p->next;

        free(q);

        q = NULL;

        printf("delete is ok\n");

        return;

    }

    while(p)//如果不是,进行遍历,查看是否有节点信息相同

    {

        if(strcmp(ScanfName, p->next->person.name) == 0)//判断是否是对应节点,如果是退出

        {

            break;

        }

        p = p->next;//向下一个节点移动

    }

    list *q = p->next;//进行删除

    p->next = q->next;

    free(q);

    q = NULL;

    printf("delete is ok\n");

}

void printList(list *p)//打印节点的信息

{

while(p->next != NULL)//进行遍历打印

{

p = p->next;

printf("name :%s, id :%d, score :%d\n", p->person.name, p->person.id, p->person.score);

}

}

int main(int argc, const char *argv[])

{

list *h = CreateEmptylist();//创建空链表

int i, ScanfId, ScanfScore;//所需要的参数

char ScanfName[100] = { 0 }, deleteName[100] = { 0 };//所需要的参数

while(1)

{

printf("input your name, id, score, if you want not to input -1\n");

scanf("%s%d%d", ScanfName, &ScanfId, &ScanfScore);//输入增加节点信息

if(ScanfName[0] == -1 || ScanfScore == -1 || ScanfId == -1)//判断用户是否想要退出

{

break;

}

insertList(h, ScanfName, ScanfId, ScanfScore);//进入增加节点函数

memset(ScanfName, '\0', sizeof(ScanfName));//对于ScanfName进行初始化

}

printList(h);//打印节点

printf("input delete node name\n");

scanf("%s", deleteName);//输入想删除的节点

deleteListNode(h, deleteName);//进入删除函数

printList(h);//进行打印

return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值