//链表的相关操作
#include <stdio.h>
#include <stdlib.h>
typedef int element;
typedef struct list
{
element data;
struct list *next;
}LINK_LIST;
LINK_LIST*creat_linklist();//建立链表(头插法和尾插法)
void inser_beforelinklist(LINK_LIST*head,LINK_LIST*q,LINK_LIST*s);
//前插法进行插入数据
void inser_afterlinklist(LINK_LIST*p,LINK_LIST*s);//后插法进行插入数据
int insert_nodelinklist(LINK_LIST*head,LINK_LIST*s,int i);//在指定位置插入数据
void print_linklist(LINK_LIST*head);//链表的遍历
LINK_LIST*search_linklist(LINK_LIST*head,element x);//按值进行查找
LINK_LIST*Getdata_linklist(LINK_LIST*head,int i);//按序号进行查找
int delet_linklist(LINK_LIST*p);//删除其后继节点
int Delet_linklist(LINK_LIST*head,LINK_LIST*p);//删除指定节点
int deletnode_linklist(LINK_LIST*head,int i);//按指定位置进行删除
LINK_LIST*CREAT_null(LINK_LIST*head);//置空表
void main()
{
LINK_LIST*head;
head=creat_linklist();
if(head!=NULL)
printf("链表创建成功!\n");
else
printf("链表创建失败!\n");
}
LINK_LIST*creat_linklist()//链表的创建
{ //头插法进行链表的创建
/*LINK_LIST*head;
LINK_LIST*p;
element x;
head=(LINK_LIST*)malloc(sizeof(LINK_LIST));
if(head==NULL)
return NULL;
else
head->next=NULL;
printf("请输入数据:\n");
scanf("%d",&x);
while(x!=0)
{
p=(LINK_LIST*)malloc(sizeof(LINK_LIST));
if(p==NULL)
return p;
else
{
p->data=x;
p->next=head->next;
head->next=p;
// printf("请继续输入数据 键入0结束输入:\n");
scanf("%d",&x);
}
} */
//尾插法进行链表的创建
LINK_LIST*head;
LINK_LIST*p;
LINK_LIST*tail;
element x;
head=(LINK_LIST*)malloc(sizeof(LINK_LIST));
if(head==NULL)
return head;
else
tail=head;
printf("请输入数据:\n");
scanf("%d",&x);
while(x!=0)
{
p=(LINK_LIST*)malloc(sizeof(LINK_LIST));
if(p==NULL)
printf("链表创建失败!\n");
else
tail->next=p;
tail=p;
tail->next=NULL;
scanf("%d",&x);
}
return head;
}
void inser_afterlinklist(LINK_LIST*p,LINK_LIST*s)//将s放在p的后面 后插法
{
s->next=p->next;
p->next=s;
}
void inser_beforelinklist(LINK_LIST*head,LINK_LIST*q,LINK_LIST*s)//将s插入到q的前面
{
LINK_LIST*p;
p=head;
while(p->next!=q)
{
p=p->next;
}
s->next=q;
p->next=s;
}
LINK_LIST*search_linklist(LINK_LIST*head,element x)//按值进行查找返回该值所在节点
{
LINK_LIST*p;
p=head->next;
if(p==NULL)
return NULL;
while(p->data!=x)
{
p=p->next;
}
return p;
}
LINK_LIST*Getdata_linklist(LINK_LIST*head,int i)//按序号进行查找
{
int j=0;
LINK_LIST*p;
p=head;
if(i<=0)
return NULL;
else
{
while(p!=NULL&&i>j)
{
p=p->next;
j++;
}
if(j==i)
return p;
else
return NULL;
}
}
int insert_nodelinklist(LINK_LIST*head,LINK_LIST*s,int i)//在指定位置插入数据
{
LINK_LIST*p;
if(i<=0)//头结点的序号为0
return 0;
else if(i==1)
p==head;
else
p= Getdata_linklist(head,i-1);
inser_afterlinklist(p,s);
return 1;
}
int delet_linklist(LINK_LIST*p)//删除其后继节点
{
LINK_LIST *s;
s=p->next;
if(s==NULL)//判断p是否有后继节点
return 0;
p=s->next;
free(s);
return 1;
}
void print_linklist(LINK_LIST*head)//链表的遍历
{
LINK_LIST*p;
p=head->next;
if(p==NULL)
return 0;
else
{printf("遍历后的数据为:\n");
printf("head->");
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("->end");
}
}
int Delet_linklist(LINK_LIST*head,LINK_LIST*p)//删除指定节点
{
LINK_LIST*q;
if(p->next!=NULL)
{
q=p->next;
p->data=p->next->data;
p->next=q->next;
free(q);
}
else
{
q=head;
while(q->next!=q)
{
q=q->next;
}
delet_linklist(q);//删除其后继节点
}
}
LINK_LIST*CREAT_null(LINK_LIST*head)//置空表
{
LINK_LIST*p;
p=head->next;
if(p==NULL)
return NULL;
while(p!=NULL)
{
delet_linklist(p);
p=p->next;
}
}
LINK_LIST*reverse_linklist(LINK_LIST*head)//链表的倒置
{
LINK_LIST*p;
LINK_LIST*q;
p=head->next;//指向下一个节点 //可以继续进行链表的遍历
head->next=NULL;//将原链表置空
if(p==NULL)
return NULL;
else
{
while(p!=NULL)
{
q=p;
q->next=head->next;
head->next=q;
p=p->next;
}
return head;
}
}
LINK_LIST*insertsort_linklist(LINK_LIST*head,LINK_LIST*s)
{
LINK_LIST*p;
p=head;
if(p==NULL)
return NULL;
else
{
while((p->next!=NULL)&&(p->next->data<s->data))//可以获知前一个节点 进行插入
p=p->next;
s->next=p;
p->next=s;
}
return head;
}
C语言数据结构单链表的相关操作
最新推荐文章于 2023-05-06 22:43:40 发布