单链表的建立、测长、打印、删除节点、插入节点、排序、逆置操作。

 
 
#include<iostream>
#include<stdio.h>

using namespace std ;
struct node {
char data ;
node * next ;
};
typedef node * NODE ;

NODE createlink ( int len ) //建立单链表
{
NODE head , n , p ;
p = head = new node ;
head -> next = NULL ;
for ( int i = 1 ; i <= len ; i ++ )
{
n = new node ;
printf ( "请输入新元素的值" );
scanf_s ( "%d" , & n -> data );
n -> next = NULL ;
p -> next = n ;
p = n ;
}
return head ;
}
int getlength ( NODE & list ) //求表长操作
{
int num = 0 ;
NODE p ;
p = list -> next ; //p指向链表的第1个结点
while ( p )
{
num ++ ;
p = p -> next ;
}
return num ;
}

void print ( NODE & list ) //打印链表
{
NODE p ;
p = list -> next ;
while ( p )
{
printf ( "%d " , p -> data );
p = p -> next ;
}
cout << endl ;
}

NODE deleteelement ( NODE head , int pos , int len ) //单链表删除结点操作
{
int n = pos ;
int i = 0 ; //头结点序号为0,其余依次类推
NODE p1 , p2 ;
p1 = head ; //头节点
if ( n == 1 ) //要删除的节点为头节点
{
head = p1 -> next ;
delete p1 ;
return head ;
}
while ( i < n - 1 ) //找到要删除的节点的前置节点
{
i ++ ;
p1 = p1 -> next ;
}
if ( n < len ) //删除中间节点
{
p2 = p1 -> next ;
p1 -> next = p2 -> next ;
delete p2 ;
}
if ( n == len ) //删除尾节点
{
p2 = p1 -> next ;
p1 -> next = NULL ;
delete p2 ;
}
return head ;
}

NODE insert ( NODE head , int pos , int len ) //插入节点
{
int n = pos ;
int i = 0 ;
NODE p1 , p2 ;
p1 = head ; //头节点
NODE p = ( node * ) malloc ( sizeof ( node ));
printf ( "请输入插入节点数值: \n " );
scanf_s ( "%d" , & p -> data );
if ( n == 0 ) //插入表头
{
p -> next = p1 ;
head = p ;
return head ;
}
while ( i < n - 1 ) //找到要插入节点的前置节点
{
i ++ ;
p1 = p1 -> next ;
}
if ( n < len ) //插到表中
{
p2 = p1 -> next ;
p1 -> next = p ;
p -> next = p2 ;
}
if ( n == len ) //插到表尾
{
p1 -> next = p ;
p -> next = NULL ;
}
return head ;
}
void sort ( NODE & list ) //单链表的排序,冒泡排序法,注意这里只需对结点值data排序,结点关系不必动
{
NODE p , q ;
int len = getlength ( list );
int temp ;
p = list -> next ; //p指向链表第一个结点
if ( p == NULL || p -> next == NULL ) //当为空链表或只有一个结点时直接返回
{
return ;
}
else
{
for ( int i = 0 ; i < len ; i ++ )
{
q = p -> next ;
for ( int j = i ; j < len - 1 ; j ++ )
{
if (( p -> data ) > ( q -> data ))
{
temp = p -> data ;
p -> data = q -> data ;
q -> data = temp ;
}
q = q -> next ;
}
p = p -> next ;
}
return ;
}
}

void invert ( NODE & list ) //单链表的逆置
{
NODE p , s , t ;
p = list ; //头节点
s = p -> next ;
while ( s -> next )
{
t = s -> next ;
s -> next = p ;
p = s ;
s = t ;
}
s -> next = p ;
list -> next -> next = NULL ; //收尾
list -> next = s ; //赋头
}
void main ()
{
int len = 10 ;
NODE L ;
L = createlink ( len );
cout << "单链表长度" << getlength ( L ) << endl ;
cout << "建立的单链表为:" ;
print ( L );
deleteelement ( L , 5 , len );
cout << "删除节点后的链表为:" ;
print ( L );
insert ( L , 5 , len );
cout << "插入节点后的链表为:" ;
print ( L );
sort ( L );
cout << "排序后的链表为:" ;
print ( L );
invert ( L );
cout << "逆置后的链表为:" ;
print ( L );
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值