#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 );}
单链表的建立、测长、打印、删除节点、插入节点、排序、逆置操作。
最新推荐文章于 2019-04-24 17:15:21 发布