1.数据域的值不重复
linkList* delNode(linkList *h,int key){//通过关键字去删除节点
linkList *p,*q;
for(p=h;p&&p->data!=key;q=p,p=p->next);//空循环
if(p==NULL){
printf("没找到");
}else if(p==h){
h=h->next;
free(p);
}else{
q->next = p->next;
free(p);
}
return h;
}
2.如何数据域值重复
处理过程分为
头结点:将头结点head指针前移,并且移动p节点
中间和尾节点:p、q两指针联动,删除p操作,将q的下一个节点q->next,连接到p的下一个节点p->next
//有重复值
linkList* delNode1(linkList *h,int key){
linkList *p,*q;
p=h;
while(p){
if(p->data!=key){
q=p;
p=p->next;
}else{
if(p==h){
h=h->next;
free(p);
p=h;
}else{
q->next=p->next;//将q的下一个节点q->next,连接到p的下一个节点p->next
free(p);
p=q->next;
}
}
}
return h;
}
附源码:
#include<stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}linkList;
linkList* initLink(int *a,int n){
linkList *h,*newp,*t;
h=t=(linkList*)malloc(sizeof(linkList));//开辟内存空间
h->data = a[0];
int i;
for(i=1;i<n;i++){
newp=(linkList*)malloc(sizeof(linkList));
newp->data = a[i];
newp->next = NULL;
t->next=newp;
t=newp;
}
return h;
}
void printLink(linkList* head){
linkList* p;
for(p=head;p!=NULL;p=p->next){
printf("%d\n",p->data);
}
}
linkList* delNode(linkList *h,int key){
linkList *p,*q;
for(p=h;p&&p->data!=key;q=p,p=p->next);
if(p==NULL){
printf("没找到");
}else if(p==h){
h=h->next;
free(p);
}else{
q->next = p->next;
free(p);
}
return h;
}
int main(void){
int a[6]={1,2,3,4,5,6};
linkList * head;
head=initLink(a,6);
printLink(head);
printf("--------链表删除---------\n");
head=delNode(head,3); //删除值为3的节点
printLink(head);
return 0;
}