学链表也学了有一段时间了,在这里先总结一下
1.链表的中头结点相当重要,判断是否有值或为空相当重要,建议头结点一般设置为不赋值
2.每次操作一般都是从移动元素的上一个结点来操作,这也是头结点为建议不赋值的原因
3.链表的每次指向变化最好还是画图更加清晰易懂
删除两条链表重复的数
我的思路就是用较长链表遍历较短链表,再创一条链表把不重复的数存储起来。。。
#include <stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE;
NODE *createa()
{
NODE *head,*p,*q;
int i,j,k;
k=0;
head=NULL;
for(i=0;i<10;i++)
{
p=(NODE *)malloc(sizeof(NODE));
p->data=k+2;
p->next=NULL;
if(head==NULL)
{
head=p;
}
else
{
q->next=p;
}
q=p;
k+=2;
}
return head;
}
NODE *createb()
{
NODE *head,*p,*q,*t;
int i,j,k;
k=0;
head=NULL;
for(i=0;i<5;i++)
{
p=(NODE *)malloc(sizeof(NODE));
p->data=k+2;
p->next=NULL;
if(head==NULL)
{
head=p;
}
else
{
q->next=p;
}
q=p;
k+=4;
}
return head;
}
void shuchu(NODE *head)
{
while(head!=NULL)
{
printf("%d ",head->data);
head=head->next;
}
}
NODE *shanchu(NODE* la,NODE *lb)//这篇代码的核心
{
NODE *q,*p,*t,*head;
int i,flag;
q=la;
p=lb;
head=(NODE *)malloc(sizeof(NODE));//为下面存储不同数做准备
head->next=NULL;
for(i=0;i<10;i++)
{
flag=0;
while(p!=NULL)
{
if(q->data==p->data)//较长链遍历较短链
{
flag=1;
break;
}
p=p->next;
}
if(flag==0)
{
t=(NODE *)malloc(sizeof(NODE));//头插法创建新链存储不重复数
t->data=q->data;
t->next=head->next;
head->next=t;
}
q=q->next;// 判断下一个结点
p=lb;//新的遍历还是从较短链开始
}
return t;//注意不要返回head;
}
int main(void)
{
NODE *la,*lb,*q;
la=createa();
lb=createb();
shuchu(la);
printf("\n");
shuchu(lb);
printf("\n");
q=shanchu(la,lb);
while(q!=NULL)
{
printf("%d ",q->data);
q=q->next;
}
}
冒泡排序//交换结点
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE;
NODE *create(int n)
{
int a;
NODE *head,*p,*q,*t;
t=(NODE *)malloc(sizeof(NODE));
head=NULL;
while(n--)
{
scanf("%d",&a);
p=(NODE *)malloc(sizeof(NODE));
p->data=a;
p->next=NULL;
if(head==NULL)
{
head=p;
}
else
{
q->next=p;
}
q=p;
}
t->next=head;//设立一个空的表头,为下面结点交换做准备
r