c语言删除节点函数 删除节点的函数

c语言中怎么插入和删除节点

/*

创新互联主要业务有网站营销策划、成都做网站、成都网站建设、微信公众号开发、微信小程序开发H5建站、程序开发等业务。一次合作终身朋友,是我们奉行的宗旨;我们不仅仅把客户当客户,还把客户视为我们的合作伙伴,在开展业务的过程中,公司还积累了丰富的行业经验、全网整合营销推广资源和合作伙伴关系资源,并逐渐建立起规范的客户服务和保障体系。 

链表节点的插入与删除

编译环境:VC++ 6.0

编译系统:windows XP SP3

*/

#include stdio.h

#include stdlib.h

#include malloc.h

//    定义链表中的节点

typedef struct node

{

int member;                //    节点中的成员

struct node *pNext;        //    指向下一个节点的指针

}Node,*pNode;

//    函数声明

pNode CreateList();                 //  创建链表函数

void TraverseList(pNode );            //  遍历链表函数

bool Insert_Node(pNode ,int ,int);    //    链表节点插入函数,第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据

int Del_Node(pNode,int );        //    删除链表节点,第一个参数是头节点,第二个参数是删除第几个节点,第三个作为

int main()

{

pNode pHead = NULL;                //  定义初始化头节点,等价于 struct Node *pHead == NULL

int data;                        // 作为Insert_Node函数的第三个参数

int num;                        //    作为Inset_Node函数第二个参数

int choose;

int return_val;

pHead = CreateList();            //  创建一个非循环单链表,并将该链表的头结点的地址付给pHead

printf("你输入的数据是:");

TraverseList(pHead);    //  调用遍历链表函数

printf("是否还要进行如下操作:\n");

printf("1.插入数据      2.删除数据\n");

printf("请输入:");

scanf("%d",choose);

switch (choose)

{

case 1:

{

printf("请输入要在第几个节点前插入数据:");

scanf("%d",num);

printf("请输入要插入的数据:");

scanf("%d",data);

if(Insert_Node(pHead,num,data) == true)

{

printf("插入成功\n插入后的数据是:\n");

TraverseList(pHead);

}

else

{

printf("插入失败\n");

}

printf("操作完成后的数据是:");

TraverseList(pHead);

break;

}

case 2:

{

printf("请输入要删除第几个节点的数据:");

scanf("%d",num);

return_val = Del_Node(pHead,num);

if (return_val == 0)

{

printf("删除失败。\n");

}

else

{

printf("删除成功。删除的元素是:%d\n",return_val);

}

printf("操作完成后的数据是:");

TraverseList(pHead);

}

}

return 0;

}

//    创建链表函数

pNode CreateList()

{

int i;                                            //    用于下面循环

int len;                                        //    用来存放有效节点的字数

int val;                                        //    用于临时存放用户输入的数据

pNode pHead = (pNode)malloc(sizeof(Node));        //  分配一个不存放有效数据的头结点

pNode pTail = pHead;                            //    链表的最后一个节点

pTail-pNext = NULL;                            //    最后一个节点的指针置为空

printf("请输入节点个数:");

scanf("%d",len);

for(i = 0; i  len; i++)

{

printf("第 %d 个节点的数值:",i+1);

scanf("%d",val);

pNode pNew = (pNode)malloc(sizeof(Node));    //    为节点分配空间

pNew-member = val;                            //将用户输入的数据赋给节点的成员

pTail-pNext = pNew;                        //将最后一个节点的指针指向下一个新的节点

pNew-pNext = NULL;                            //将新节点中的指针置为空

pTail = pNew;                                //将新节点赋给最后的一个节点

}

return pHead;                                    //返回头节点

}

//    遍历链表函数

void TraverseList(pNode pHead)

{

pNode p = pHead-pNext;                            //将头节点的指针给予临时节点p

while(NULL != p)                                //节点p不为空,循环

{

printf("%d ",p-member);

p = p-pNext;

}

printf("\n");

return ;

}

//    链表节点插入函数

//    第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据

bool Insert_Node(pNode pHead, int front,int data)

{

int i = 0;

pNode _node = pHead;

pNode pSwap;                                //    用于交换

if ((front  1)  (NULL != _node))        //判断用户输入的数据是否大于等于1,及_node是否为空

{

return false;

}

while (i  front - 1)                    //通过循环使指针指向要插入哪个节点前的节点。说的自己都不懂了,还是看下面的图吧。

{

_node = _node-pNext;

++i;

}

pNode pNew = (pNode)malloc(sizeof(Node));

pNew-member = data;                        //    把输入的数据赋给要插入的节点

pSwap = _node-pNext;                        //    把下一个节点的地址,给用于交换的pSwap

_node-pNext = pNew;                        //    把要插入的节点的地址,给上个节点的指针域

pNew-pNext = pSwap;                        //    把插入节点的下一个节点的地址,给插入节点的指针域

return true;

}

//    删除链表节点函数

//    第一个参数是头节点,第二个参数是要删除第几个节点·······和上面的插入函数是不是很像

int Del_Node(pNode pHead,int back)

{

int i = 0;

int data;

pNode _node = pHead;

pNode pSwap;

if ((back  1)  (NULL == _node-pNext))

{

printf("删除失败!\n");

return 0;

}

while(i  back-1)

{

_node = _node-pNext;

++i;

}

pSwap = _node-pNext;

data = pSwap-member;

_node-pNext = _node-pNext-pNext;

free(pSwap);

return data;

}

我自己也画了两张图片,帮助理解,反正我是这么理解的,有错的欢迎指出

先看下向链表中插入节点

下面这个是删除链表节点

写一个删除指定节点的函数(C语言)

用两个指针,p,qp指向该结点的前驱,p指向该结点,然后 p-next=q-next;就删除成功了~~

C语言关于链表删除某个节点的问题,不知道写法,麻烦指点

struct node *delete(struct node* head)//删除函数

{

printf("请输入要删除的学生姓名");

char k[100];

scanf("%s", k);

struct node *pre = NULL;

struct node *q   = head;

while (q) {

if (strcmp(q-data.name, k) == 0){

if (pre)

pre-next = q-next;

else 

head = q-next;

free(q);

break;

}

pre = q;

q = q-next;

}

return head;

}

c语言 链表删除节点

刚学C语言呢,就是看不出来这个问题,其实问题很简单,就是你在C语言的函数里面传入了一个值,是的它是一个值,你看到的你传了一个指针进去,其实这个指针本身也是一个值,链表的头结点是个指针,你要改变这个指针就要用指针的指针才能改变,指针变量也是一个变量,你传入一个指针他也只是在函数的作用域里面过了一份拷贝!看程序!

/*你想改变a的值,所以你传了一个指针进去*/

void change(int *a)

{

*a = 10;

}

int main()

{

int a = 0;

change(a);

}

这里要说的是其实,指针也是一个变量;所以你想改变一个指针的值,同样的你也要把这个指针的地址传进去,就是指针的指针了,看代码!

void changePtr(int* *a)

{

*a = (int*)malloc(sizeof(int));

}

int main()

{

int a = 10,*p = a;

changePtr(p);

}

上面的两个代码我也没测!就是举个例子!

看下面的代码!就是你这个链表的!或者直接打开下面网址(包含下面代码输出结果)

#define size 5

#define del1 "one"

#define del5 "five"

#define del "none"

#define del3 "three"

typedef struct VIDEO {

char name[20];

struct VIDEO *next;

} video;

/*video *head;*/

void build(video**head) {

int i = 0;

video *temp;

char *ss[5] = {"one","two","three","four","five"};

temp = *head = NULL;

for(i = 0;i  size;i++) {

if(*head) {

temp-next = (video*)malloc(sizeof(video));

temp = temp-next;

/*scanf("%s",temp-name);*/

strcpy(temp-name,ss[i]);

temp-next = NULL;

} else {

*head = (video*)malloc(sizeof(video));

/*scanf("%s",head-name);*/

strcpy((*head)-name,ss[i]);

(*head)-next = NULL;

temp = *head;

}

}

}

int delete(video**head,char *str) {

video *cur,*prv = *head;

if(*head == NULL) return 0;

if(strcmp((*head)-name,str) == 0) {

*head = (*head)-next;

free(prv);

return 1;

}

cur = prv-next;

while(cur  strcmp(cur,str)) {

cur = cur-next;

prv = prv-next;

}

if(cur) {

prv-next = cur-next;

free(cur);

return 1;

} else {

return 0;

}

}

void show(video *head) {

if(head) {

printf("%s",head-name);

while(head-next) {

head = head-next;

printf("-%s",head-name);

}

printf("\n");

}

}

int main()

{

video *head;

build(head);

show(head);

delete(head,del1);

show(head);

delete(head,del5);

show(head);

delete(head,del);

show(head);

delete(head,del3);

show(head);

return 0;

}

输出结果为:

one-two-three-four-five

two-three-four-five

two-three-four

two-three-four

two-four

c语言,删除指定段节点函数。

p1 = head;

p = head-next;

while(p-next != NULL)//当链表下个节点不是末尾时

{

if((p-number mink)||(p-number maxk))//如果节点值不满足条件,则删除该节点

{

p = p-next;

p1-next = p;

}

else //寻找下一个节点

{

p =p-next;

p1 = p1-next;

}

}

C语言删除节点

额。。

反正要删除要两个指针

1、P1一个指向要删除的上一个节点,P2一个指向要删除节点

2、把P1指向P2的next-

3、释放没用的空间


网页名称:c语言删除节点函数 删除节点的函数
文章网址:http://scyanting.com/article/hihdis.html