链表的基本算法

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef  struct List
{
int date;
struct List *next;
}NODE,*Node;
Node headcreate_List();//头插法
 Node tailcreate_List();//尾插法
void traverse_List(Node);//遍历
Node merge_List(Node,Node);//将两个链表合并
void delete_List(Node);//删除链表中相同的节点的值;
void delete_Noedlist(Node,Node);//删除两个链表相同的节点的值;


int main(void)
{
Node Head,head;
Head=headcreate_List();//头插法
traverse_List(Head);
head=tailcreate_List();//尾插法
traverse_List(head);
delete_Noedlist(Head,head);
traverse_List(Head); 
//merge_List(Head,head);
//traverse_List(Head); 
//delete_List(Head); //删除相同的节点
traverse_List(Head); 
return 0;
}


Node tailcreate_List()
{
Node Head,p,s;
int val;
Head=(Node)malloc(sizeof(NODE));
if(!Head)
{
printf("动态内存分配失败!\n");
exit(-1);
}
Head->next=NULL;//初始化.建立一个空头表
p=Head;//p始终指向尾指针(每新生成节点,该链表此时的尾指针)。
printf("尾插法请输入节点:(q to quit):");
while(scanf("%d",&val)==1)
{
s=(Node)malloc(sizeof(NODE));
if(!s)
{
printf("动态内存分配失败!\n");
exit(-1);
}
s->date=val;
p->next=s;
p=s;
}
p->next=NULL;
getchar();
//清空缓冲区。因为最后一次的换行符也被scanf读取了。
return Head;
}
Node headcreate_List()//头插法插法
{
Node Head,s;
int val;
Head=(Node)malloc(sizeof(NODE));
if(!Head)
{
printf("动态内存分配失败!\n");
exit(-1);
}
Head->next=NULL;
printf("头插法请输入节点(q to quit):");
while(scanf("%d",&val)==1)
{
s=(Node)malloc(sizeof(NODE));
if(!s)
{
printf("动态内存分配失败!\n");
exit(-1);
}
s->date=val;
s->next=Head->next;//第一次生成的节点,指针域就被NULL了。每次生成的节点都是先与头结点后面的节点连起来
Head->next=s;//接着新节点在与头结点连起来。
}
getchar();
//清空缓冲区。因为最后一次的换行符也被scanf读取了。
return Head;
}
void traverse_List(Node Head)
{
Node p;
p=Head->next;
printf("遍历输出:");
while(p)
{
printf("%3d",p->date);
p=p->next;
}
printf("\n");
return ;
}
/*Node merge_List(Node Head,Node head)
{
Node p,q,s;
p=Head->next;
q=head->next;
printf("将两个链表合并后输出:");
while(p)
{
s=p;
p=p->next;//此时p指向尾节点

}
s->next=q;
free(head);
return Head;
}*/
void delete_Noedlist(Node Head,Node head)//删除两个链表相同的节点
{
Node p,q,s;
p=Head->next;
q=head->next;
printf("删除两个链表相同的节点:");
while(p)
{
s=p;
p=p->next;//此时p指向尾节点

}
s->next=q;
free(head);//将两个链表合并了
for(p=Head;p->next!=NULL;p=p->next)
{
for(q=p->next;q->next!=NULL;q=q->next)
if(p->next->date==q->next->date)
{
s=q->next;
q->next=s->next;
free(s);
}
}
return ;
}
/* void delete_List(Node Head)//删除一个链表中相同的节点:
{
Node p,q,s,r,t;
printf("删除相同节点后》");
for(p=Head;p->next;p=p->next)//p->next!=NUU.p是尾节点的前驱。这是可以调用p->next->data。
{
for(q=p->next;q->next;q=q->next)
if(p->next->date==q->next->date)
{
s=q->next;
q->next=s->next;
free(s);
}
}
return ;
}*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值