- 项目1删除链表中的重复值,首先的要有一个岗哨,及第一次循环最起始的阶段的值作比较,删除一个元素要有一个前驱,一个后继,所以得必须有两个指针同时遍历,外加一个岗哨做判断,一共三个指针。
#include <stdio.h>
#include <stdlib.h>
typedef struct note{
int data;
struct note *next;
}elemsn;
elemsn *create(int b[],int n);
void print(elemsn *p);
void delete(elemsn *head);
int main(void)
{
elemsn *head;
int n;
printf("请输入数组个数:");
scanf("%d",&n);
int a[n];
int i;
printf("请输入数组:\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
head=create(a,n);
print(head);
printf("\n");
delete(head);
print(head);
}
elemsn *create(int b[],int n)
{
int i;
elemsn *q,*p;
elemsn *head=NULL;
for(i=0;i<n;i++)
{
p=(elemsn *)malloc(sizeof(elemsn));
p->data=b[i];
p->next=NULL;
if(!head)
{
head=q=p;
}
else
{
q->next=p;
q=p;
}
}
return head;
}
void print(elemsn *p)
{
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
void delete(elemsn *head)
{
elemsn *p,*q,*k;
k=head;
for(k=head;k;k=k->next){
p=k;
q=k->next;
while(q){
if(k->data!=q->data){
q=q->next;
p=p->next;
}
else{
p->next=q->next;
free(q);
q=p->next;
}
}
}
}