带头结点单链表的基本操作(创建、测长、打印、插入、删除、取值、合并、排序、逆置)

单链表分为带头结点和不带头结点两种,带头结点的单链表操作起来比较简单,以下是代码(创建、测长、打印、插入、删除、取值、合并、排序、逆置)

#include <stdio.h>

#include <malloc.h>
#include <stdlib.h>


//定义链表
typedef struct list
{
int data;
struct list *next;
}Linklist;
//创建带头结点的单链表
Linklist *CreatList()
{
Linklist *head,*p,*s;
int x;
//单链表初始化
if((head=(Linklist*)malloc(sizeof(Linklist)))==NULL)
{
printf("初始化链表元素失败!");
exit(1);
}
head->next=NULL;
p=head;
//尾插法建立单链表
printf("请输入链表元素:");
while(scanf("%d",&x))
{
{
if(x!=0)
{
if((s=(Linklist*)malloc(sizeof(Linklist)))==NULL)
{
printf("初始化链表元素失败!");
exit(1);
}
s->data=x;
p->next=s;
p=s;
}
else
{
p->next=NULL;
break;
}
}
}
return head;
}
//求链表长度
int GetListLength(Linklist *head)
{
Linklist *p;
int L=0;
p=head;
while(p=p->next)
L++;
return L;
}
//打印链表
void PrintList(Linklist *head)
{
if(head->next==NULL)
{
printf("这是一个空链表\n");
return;
}
Linklist *p;
int i=1;
p=head->next;
while(p!=NULL)
{
printf("第%d个元素为:%d\n",i++,p->data);
p=p->next;
}
printf("\n");
}
//链表插入元素
int InsertList(Linklist *head,int i,int x)
{
Linklist *p,*s;
int j=0;
p=head;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j!=i-1)
{
printf("插入位置参数错误!\n");
return 0;
}
if((s=(Linklist*)malloc(sizeof(Linklist)))==NULL)
{
printf("初始化链表元素失败!");
exit(1);
}
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
//链表删除元素
int DeleteList(Linklist *head,int i)
{
Linklist *p,*s;
int j=0;
p=head;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||!p->next||j!=i-1)
{
printf("删除位置参数错误!\n");
return 0;
}
s=p->next;
p->next=s->next;
free(s);
return 1;
}
//单链表取值
int GetList(Linklist *head,int i)
{
Linklist *p;
int j=0;
p=head;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j!=i)
{
printf("查找位置参数错误!\n");
return NULL;
}
return p->data;
}
//合并两个单链表
Linklist *CombineList(Linklist* head1,Linklist* head2)
{
Linklist *temp;
if(head1==NULL)
return head2;
else if(head2==NULL)
return head1;
else
{
for(temp=head1;temp->next;temp=temp->next);
temp->next=head2->next;
}
return head1;
}
//单链表排序
Linklist *SortList(Linklist *head)
{
Linklist *p;
int i,j,n,temp;
if(head->next==NULL)
return head;
n=GetListLength(head);
for(i=1;i<n;i++)
{
p=head->next;
for(j=0;j<n-i;j++)
{
if(p->data>p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
p=p->next;
}
}
return head;
}
//单链表逆置
Linklist *ReverseList(Linklist *head)
{
Linklist *p,*s;
if(head->next==NULL)
return head;
p=head->next;
head->next=NULL;
while(p)
{
s=p;
p=p->next;
s->next=head->next;
head->next=s;
}
return head;
}
//主函数
void main()
{
Linklist *head1=CreatList();
printf("创建链表head1:\n");
PrintList(head1);


InsertList(head1,1,10);
printf("在第1个位置插入元素10:\n");
PrintList(head1);


DeleteList(head1,2);
printf("删除第2个位置的元素:\n");
PrintList(head1);


int i=GetList(head1,1);
printf("取出单链表第1个位置元素的值:\n");
printf("取出的值为:%d\n\n",i);


printf("创建链表head2:\n");
Linklist *head2=CreatList();
printf("\n",i);
CombineList(head1,head2);
printf("合并两个单链表head1和head2:\n");
PrintList(head1);


head1=SortList(head1);
printf("对链表进行排序:\n");
PrintList(head1);


head1=ReverseList(head1);
printf("对链表进行逆置:\n");
PrintList(head1);
}

猜你喜欢

转载自blog.csdn.net/u012218309/article/details/46422909