LinkList Delete(LinkList L) { //删除集合中相同的元素 LinkList p,s,q; p=L->next; if(!p) return; while(p->next!=NULL) { q=p; while(q->next) { //固定p所指结点,向后遍历,寻找与之数据域相同的结点 if(strcmp(q->next->data,p->data)==0) { //在这里将q->next所指的结点存放数据与p作比较 s=q->next; q->next=s->next; free(s); } else q=q->next; } p=p->next; } }
时间: 2024-04-23 16:24:43 浏览: 92
这是一个函数,其功能是删除链表中与其它节点数据相同的节点,其中采用了双重循环来实现。具体实现过程如下:
1. 定义了三个指针变量 p,s,q,其中 p 指向链表的第一个节点,q 指向 p,s 用来保存要删除的节点。
2. 判断 p 是否为空,若为空则直接返回。
3. 开始第一层循环,其中循环条件是 p 的下一个节点不为空,这是因为要判断当前节点与其它节点是否相同,因此需要遍历整个链表。
4. 在第一层循环中,开始第二层循环,其中循环条件是 q 的下一个节点不为空,这是因为需要遍历当前节点之后的所有节点。
5. 在第二层循环中,判断 q 的下一个节点的数据是否与 p 的数据相同,若相同则删除该节点,否则继续向后遍历。
6. 删除节点的方式是将 q 的下一个节点保存到 s 中,然后将 q 的 next 指针指向 s 的 next,最后释放 s 所指向的内存空间。
7. 第二层循环结束后,将 p 指向下一个节点,继续第一层循环,直至遍历完整个链表。
8. 函数结束,返回链表头指针 L。
相关问题
#include<stdio.h> #define MAXSIZE 100 #include<malloc.h> typedef struct node{ int data; struct node*next; }LNode,*Linklist; void create(Linklist L){ int m; Linklist s; s=L; while(1){ scanf("%d",&m); if(m==0)break; Linklist p=(Linklist)malloc(sizeof(LNode)); p->data=m; p->next=NULL; s->next=p; s=p; } } int lentgh(Linklist L){ Linklist p=L->next; int len=0; while(p){ p=p->next; len++; } return len; } void Bobblesort(Linklist L){ int len=lentgh(L); Linklist p; int a; for(int i=0;i<len-1;i++){ p=L->next; for(int j=0;j<len-i-1;j++){ if(p->data>p->next->data) { a=p->next->data; p->next->data=p->data; p->data=a; } p=p->next; } } } void Delete(Linklist L){ Linklist p=L->next; while(p->next){ if(p->data==p->next->data) { Linklist tmp=p->next; p->next=p->next->next; free(tmp); }p=p->next; } } void output(Linklist L){ Linklist p; p=L->next; while(p){ printf("%d ",p->data); p=p->next; } } int main(){ Linklist L; L=(Linklist)malloc(sizeof(LNode)); create(L); Bobblesort(L); Delete(L); output(L); }为什么不对
这段代码存在以下问题:
1.在create函数中,传入的参数是Linklist类型,即指向节点的指针,但是在函数内部对其进行修改时,并没有传入指向指针的指针,导致在函数外部无法获取到链表的头指针。
2.在Delete函数中,当p->data==p->next->data时,应该先判断p->next是否为NULL,否则会出现访问NULL指针的错误。
3.在Delete函数中,当删除节点时,应该将p指向被删除节点的前一个节点,否则会出现遍历不完整的情况。
4.在main函数中,应该对L进行初始化,即将L指向NULL,否则L中会存在随机值,导致程序出现未知错误。
下面是修改后的代码:
```c
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct node{
int data;
struct node *next;
}LNode, *Linklist;
void create(Linklist *L){
int m;
Linklist s;
*L = (Linklist)malloc(sizeof(LNode));
s = *L;
while(1){
scanf("%d",&m);
if(m == 0) break;
Linklist p = (Linklist)malloc(sizeof(LNode));
p->data = m;
p->next = NULL;
s->next = p;
s = p;
}
}
int len(Linklist L){
Linklist p = L->next;
int len = 0;
while(p){
p = p->next;
len++;
}
return len;
}
void BubbleSort(Linklist L){
int i, j, len = len(L);
Linklist p;
int a;
for(i = 0; i < len - 1; i++){
p = L->next;
for(j = 0; j < len - i - 1; j++){
if(p->data > p->next->data){
a = p->next->data;
p->next->data = p->data;
p->data = a;
}
p = p->next;
}
}
}
void Delete(Linklist L){
Linklist p = L->next;
Linklist tmp;
while(p != NULL && p->next != NULL){
if(p->data == p->next->data){
tmp = p->next;
p->next = tmp->next;
free(tmp);
}else{
p = p->next;
}
}
}
void output(Linklist L){
Linklist p;
p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
}
int main(){
Linklist L = NULL;
create(&L);
BubbleSort(L);
Delete(L);
output(L);
return 0;
}
```
注意:这里修改后的代码仅仅是修正了代码的问题,但是并没有改变代码的逻辑,所以如果前面存在的逻辑错误,还需要根据具体需求进行修改。
void Linklist::update(worker* data) //更新节点信息 { worker* p = head; worker* ptr; while (p->next != NULL) { if (p->next->m_name == data->m_name) { ptr = p->next; if (p->next->next == NULL) { p->next = data; } else { data->next = p->next->next; p->next = data; } delete ptr; break; } else { p = p->next; } }
这是一个关于链表更新节点信息的代码,我可以回答这个问题。这段代码的作用是在链表中查找名字为data->m_name的节点,如果找到了,则用data节点替换掉原来的节点。如果没有找到,则不做任何操作。具体实现是通过遍历链表,找到目标节点后,将目标节点的前一个节点指向data节点,将data节点指向目标节点的后一个节点,最后删除原来的目标节点。
阅读全文