C单链表 测试通过 路过大神指点

/*
内容:单链表结点类型定义、链表类型定义、创建链表、插入结点、删除节点、打印链表、链表长度、链表倒序等
作者:Carre_
日期:2015.9.8
*/
#include<stdio.h>
#include<stdlib.h>

#include<string.h>

#define OK 1
#define ERROR 0

//定义结点数据域类型

typedef int Elemtype;


//定义链表结点结构体
typedef struct node
{
Elemtype data;
struct node *next;
}S_node;


//定义单链表结构体
typedef struct
{
S_node *head;
}S_list;


/************************************************************************/
//初始化单链表
//头节点作为单链表入口,其数据域用来存储单链表的长度,该长度值不包括头结点
int Init_slist(S_list *L)
{
L->head=(S_node *)malloc(sizeof(S_node));
if(L->head) 
{
L->head->next=NULL;
L->head->data=0;
return OK;
}
else return ERROR;
}


/***********************************************************/
//计算单链表长度
//注:头结点不算入长度,数据域存储单链表长度
int length_slist(S_list *L)
{
int length=0;
S_node *current;
current=L->head->next;
while(current)
{
length++;
current=current->next;
}
return length;
}




/*************************************************************************/
//单链表创建
void create_slist(S_list *L)
{
S_node *current,*temp;
current=L->head;
Elemtype elem;
int num=1,length=0;
while(1)
{
printf("输入链表元素(0结束)NO.%d:",num);
scanf("%d",&elem);
if(elem==0) break;
temp=(S_node *)malloc(sizeof(S_node));
temp->data=elem;
temp->next=NULL;
current->next=temp;
current=temp;
num++;
}
length=length_slist(L);
L->head->data=length;
printf("\n");
}


/***********************************************************/
//打印单链表
void print_slist(S_list *L)
{
S_node *current;
current=L->head->next;
printf("单链表长度:%d\n",L->head->data);
printf("单链表内容:");
while(current)
{
printf("%d->",current->data);
current=current->next;
}
printf("NULL\n\n");
}


/**********************************************************/
//单链表从小到大排序
void order_slist(S_list *L)
{
S_node *current,*p;
int i,j,num,temp;
num=L->head->data;
p=L->head;
current=p->next;
if(NULL==current||NULL==current->next)
printf("单链表为空或只有一个结点\n");
else
{
for(i=1;i<num;i++)
{
for(j=1;j<=num-i;j++)
{
p=current->next;
if(current->data>p->data)
{
temp=current->data;
current->data=p->data;
p->data=temp;
}
current=p;
}
current=L->head->next;
}
}
}


/**********************************************************/
//单链表倒序,其头结点不变,链表内的元素倒序
void reverse_slist(S_list *L)
{
S_node *current,*temp,*prev;
prev=L->head->next;
current=prev->next;
prev->next=NULL;
while(current)
{
temp=current->next;
current->next=prev;
prev=current;
current=temp;
}
L->head->next=prev;
}


/***********************************************************/
//单链表插入结点,按顺序插入
void insert_snode(S_list *L,Elemtype elem)
{
S_node *current,*temp,*p;
int length;
p=current=L->head;
temp=(S_node *)malloc(sizeof(S_node));
temp->data=elem;
while((NULL!=current->next)&&(current->data<elem))
{
p=current;
current=current->next;
}
if(current==L->head) //先判断是否只有头结点
{
current->next=temp;
temp->next=NULL;
}
else
{
if(current->data>=elem)
{
p->next=temp;
temp->next=current;
}
else
{
current->next=temp;
temp->next=NULL;
}
}
length=length_slist(L);
L->head->data=length;
}


/******************************************************************/
//单链表中删除结点
void delate_snode(S_list *L,Elemtype elem)
{
S_node *current,*temp,*p;
p=L->head;
current=p->next;
if(NULL==current)
printf("单链表为空,无法进行删除操作!");
else
{
while(NULL!=current&&current->data!=elem)
{
p=current;
current=current->next;
}
if(current->data==elem)
{
p->next=current->next;
free(current);
}
else
printf("单链表中没有该结点!");
}
L->head->data=length_slist(L);
}


/***********************************************************/
//代码测试
int main()
{
S_list slist;
int flag;
//初始化单链表测试
flag=Init_slist(&slist);
if (flag) printf("单链表slist初始化成功\n");
else printf("单链表slist初始化失败\n");
/**********************************/
//创建单链表测
create_slist(&slist);
//打印链表
print_slist(&slist);
/**********************************/
//单链表小到大排序
order_slist(&slist);
//打印链表
printf("单链表小到大排序后如下:\n");
print_slist(&slist);
/**********************************/
//单链表插入结点
Elemtype number_insert;
printf("单链表插入结点\n请输入插入的结点数据:");
scanf("%d",&number_insert);
insert_snode(&slist,number_insert);
printf("单链表插入结点后内容:\n");
print_slist(&slist);
/**********************************/
//单链表中删除结点,手动输入待删除结点数据
Elemtype number_delate;
printf("单链表删除结点\n请输入待删除的结点数据:");
scanf("%d",&number_delate);
delate_snode(&slist,number_delate);
printf("单链表删除结点后内容:\n");
print_slist(&slist);
/**********************************/
//单链表内容倒序,头结点保持不变
reverse_slist(&slist);
//打印链表
printf("单链表slist内容倒序\n");
print_slist(&slist);
/**********************************/
printf("\n");
return 0;
}

























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值