C语言单链表的基本操作

#include <stdlib.h>
typedef struct List
{
int date;
struct List *next;
}NODE,*Node;
Node create_List();
 void traverse_List(Node);
void insert_List(Node,int, int );
void delete_List(Node ,int ,int*);
void reverse_List(Node);
void mege_List(Node,Node);
int main(void)
{
int postion,val,postion1,val1;
Node Head,head;
Head=create_List();
traverse_List(Head);
head=create_List();
traverse_List(head);
/*printf("请输入你要插入的位置:");
scanf("%d",&postion);
printf("请输入你要插入的值:");
scanf("%d",&val);
insert_List(Head,postion,val);
traverse_List(Head);
printf("请输入你要删除的位置:");
scanf("%d",&postion1);
delete_List(Head,postion1,&val1);
traverse_List(Head);
printf("将该链表就地转置后:");
reverse_List(Head);
traverse_List(Head);*/
mege_List(Head,head);
traverse_List(Head);
return 0;
}
/* Node create_List()
{
int n,i,val;
Node Head,p,s;
Head=(Node)malloc(sizeof(NODE));
if(Head==NULL)
{
printf("动态内存分配失败!\n");
exit(-1);
}
Head->next=NULL;
p=Head;//p始终指向尾指针
printf("请输入节点的个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{

printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
s=(Node)malloc(sizeof(NODE));
s->date=val;
p->next=s;
p=s;
}
s->next=NULL;
return Head;
}*/
Node create_List()
{
Node Head,p;
int val;
Head=(Node)malloc(sizeof(NODE));
Head->next=NULL;
if(Head==NULL)
{
printf("动态内存分配失败!\n");
exit(-1);
}
printf("(尾插法)请输入节点(q to quit):");
while(scanf("%d",&val)==1)
{
p=(Node)malloc(sizeof(NODE));
p->date=val;
p->next=Head->next;//第一次时,就是首节点也就是插入完后的尾节点为NULL;首先头插入和插入法是一样的思想。都是先把新的节点先连后面的节点
Head->next=p;//然后在和首节点连起来
}
getchar();//清空缓冲区的值!
return Head;
}
void traverse_List(Node Head)
{
Node p;
p=Head->next;
printf("节点遍历:");

if(p==NULL)//如果没有首节点。
printf("没有节点生成!\n");
else
{
while(p)
{
printf("%3d",p->date);
p=p->next;
}
}
printf("\n");
return ;
}
void insert_List(Node Head,int postion, int val)
{
int i;
Node p,s;
p=Head;
for(i=0;p&&i<postion-1;i++)//因为插入的位置有n+1个;所以有可能也在首节点前面插入。所以就要从头结点开始遍历。同时也判断p是否空表。
{
p=p->next;
}
if(i!=postion-1)
{
printf("插入的位置不合理!\n");
return ;
}
s=(Node)malloc(sizeof(NODE));
s->date=val;
s->next=p->next;
p->next=s;
return ;
}
void delete_List(Node Head,int postion,int *val)
{
Node p,q;
p=Head;
int i;
for(i=0;p->next&&i<postion-1;i++)//删除的位置有n个。删除必须要从首节点以后的节点。同时也判断了书否表空
{
p=p->next;//此时已经指向了要删除位置节点的前驱
}
if(i!=postion-1)
{
printf("插入位置不合法!\n");
}
q=p->next;
p->next=q->next;
*val=q->date;
printf("要删除该位置节点的值为%d:\n",q->date);
free(q);
return ;
}
void reverse_List(Node Head)
{
Node p,q;
if(Head->next&& Head->next->next)
{//当该链表不是空表后者单节点的时候。
p=Head->next;
q=p->next;//将首节点后面的节点看成另外一个链表
p->next=NULL;
while(q)
{
p=q;//此时p当做了q的尾指针。
q=q->next;//是q遍历后面的节点。
p->next=Head->next;
Head->next=p;
}
return ;
}
return ;
}
void mege_List(Node Head,Node head)
{
Node p,q,s;
p=Head->next;
q=head->next;
printf("链表合并后:");
while(p)
{ s=p;
p=p->next;
}
s->next=q;
free(head);
return ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值