一、题目
再带头节点的单链表L中,删除所有值为x的节点,并释放其空间,假设值为x的节点不唯一,试编写算法以实现上述操作。
二、分析
题目非常简单,只要熟悉单链表的基本操作就可以很快解决这个问题。
三、代码
#include<stdio.h> #include<stdlib.h> //对单链表的定义 typedef struct LinkNode{ int data; LinkNode *next; }LinkNode,*LinkList; //对单链表的初始化 void InitLinkList(LinkList &L){ L =(LinkList)malloc(sizeof(LinkList)); L->next = NULL; } //插入一个节点(头插法) bool AddLinkList(LinkList &L,int &x){ LinkNode *p = (LinkNode*)malloc(sizeof(LinkNode)); //内存不足 if(p == NULL) return false; p->data = x; p->next = NULL; p->next = L->next; L->next = p; return true; } //删除一个值x为节点 bool DeleteLinkList(LinkList &L,int x){ LinkNode *s; LinkNode *p = L->next; LinkNode *q = L; if(p == NULL) return false; while(p != NULL){ if(p->data != x){ q = p; p = p->next; } else{ q->next = p->next; s = p; p = q->next; free(s); } } return true; } //输出链表中的数据 void PrintLinkList(LinkList L){ LinkNode *p = L->next; while(p != NULL){ printf("%d ",p->data); p = p->next; } printf("\n"); } int main(){ //测试 LinkList L; int y; int N = 10; //N表示输入的数值个数 int x = 1; //x表示题目要求删除的值 InitLinkList(L); while(N--){ y = random()%5; AddLinkList(L,y); } PrintLinkList(L); DeleteLinkList(L,x); PrintLinkList(L); return 0; }