GitHub:https://github.com/nothingsuibian/Simple-blog.git
一.顺序表
1.静态顺序表
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# define Maxsize 5
typedef struct {
int data[ Maxsize] ;
int length;
} sqlist;
void init_list ( sqlist* lt) {
int i;
for ( i= 0 ; i< Maxsize; i++ ) {
lt-> data[ i] = 0 ;
}
lt-> length= 0 ;
}
void create_list ( sqlist * lt, int num) {
printf ( "请输入元素:" ) ;
int i;
for ( i = 0 ; i< num; i++ ) {
scanf ( "%d" , & lt-> data[ i] ) ;
}
lt-> length+= num;
}
void insert_list ( sqlist * lt) {
int n, i, e;
printf ( "请输入要插入的下标 和 元素:" ) ;
scanf ( "%d %d" , & n, & e) ;
if ( n>= 0 && n<= lt-> length) {
if ( Maxsize== lt-> length) {
printf ( "当前表满,插入失败!" ) ;
}
else {
for ( i= lt-> length- 1 ; i>= n; i-- ) {
lt-> data[ i+ 1 ] = lt-> data[ i] ;
}
lt-> data[ n] = e;
lt-> length++ ;
}
}
else {
printf ( "有效下标在0到%d之间:" , lt-> length) ;
}
}
void delete_list ( sqlist * lt)
{
int n, i, s, m, j;
s= 0 ;
printf ( "请输入要删除元素方式 1.下标 2.元素值:" ) ;
scanf ( "%d" , & n) ;
if ( n== 1 ) {
printf ( "请输入要删除的元素下标:" ) ;
scanf ( "%d" , & m) ;
if ( n>= 0 && m<= lt-> length- 1 ) {
printf ( "删除下标%d的元素值%d:\n:" , m, lt-> data[ m] ) ;
for ( i= m; i< lt-> length- 1 ; i++ )
{
lt-> data[ i] = lt-> data[ i+ 1 ] ;
}
lt-> length-- ;
s= 1 ;
}
else {
printf ( "表中下标0到%d:" , lt-> length- 1 ) ;
}
}
else if ( n== 2 )
{
printf ( "请输入要删除的元素值:" ) ;
scanf ( "%d" , & m) ;
for ( i= lt-> length- 1 ; i>= 0 ; i-- )
{
if ( lt-> data[ i] == m)
{
for ( j= i; j< lt-> length; j++ )
{
lt-> data[ j] = lt-> data[ j+ 1 ] ;
}
lt-> length-- ;
s= 1 ;
break ;
}
}
if ( s== 0 ) {
printf ( "无该元素" ) ;
}
}
else {
printf ( "输入错误" ) ;
}
}
void print_list ( sqlist lt) {
int i;
if ( lt. length!= 0 ) {
printf ( "当前表中元素有:" ) ;
for ( i= 0 ; i< lt. length; i++ )
{
printf ( "%d\t" , lt. data[ i] ) ;
}
printf ( " 表长%d:\n" , lt. length) ;
}
else {
printf ( "当前为空表!" ) ;
}
printf ( "\n" ) ;
}
void find_list ( sqlist lt) {
int n, i, m, s;
s= 0 ;
printf ( "请输入要查找元素方式 1:下标 2:元素值:" ) ;
scanf ( "%d" , & n) ;
if ( n== 1 )
{
printf ( "请输入查找的元素下标:" ) ;
scanf ( "%d" , & m) ;
if ( m>= 0 && m<= lt. length- 1 ) {
printf ( "查找元素下标为%d的元素值为%d \n:" , m, lt. data[ m] ) ;
s= 1 ;
}
else {
printf ( "表中下标0到%d:" , lt. length- 1 ) ;
}
}
else if ( n== 2 )
{
printf ( "请输入要查找的元素值:" ) ;
scanf ( "%d" , & m) ;
for ( i= lt. length- 1 ; i>= 0 ; i-- )
{
if ( lt. data[ i] == m)
{
printf ( "元素下标为%d \n" , i) ;
s= 1 ;
break ;
}
}
}
else
{
printf ( "输入错误" ) ;
}
if ( s== 0 )
{
printf ( "未找到该元素,查找失败\n" ) ;
}
}
int main ( ) {
int num;
printf ( "输入创建表长:" ) ;
scanf ( "%d" , & num) ;
sqlist lt;
init_list ( & lt) ;
create_list ( & lt, num) ;
int n;
while ( 1 )
{
printf ( "输入要进行的操作:\n 1.查找 2.插入 3.删除: " ) ;
scanf ( "%d" , & n) ;
if ( n== 0 ) { break ; }
switch ( n)
{
case ( 1 ) :
find_list ( lt) ;
break ;
case ( 3 ) :
delete_list ( & lt) ;
break ;
case ( 2 ) :
insert_list ( & lt) ;
break ;
default :
printf ( "输入操作不存在!" ) ;
}
print_list ( lt) ;
printf ( "\n" ) ;
}
}
2. 动态顺序表
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <malloc.h>
# define Maxsize 5
typedef struct {
int * data;
int max, length;
} sqlist2;
void init_list2 ( sqlist2* lt) {
if ( lt != NULL ) {
lt-> data = ( int * ) malloc ( sizeof ( int ) * Maxsize) ;
lt-> length= 0 ;
lt-> max = Maxsize;
}
}
void create_list2 ( sqlist2 * lt, int num) {
printf ( "请输入元素:" ) ;
int i;
for ( i = 0 ; i< num; i++ ) {
scanf ( "%d" , & lt-> data[ i] ) ;
}
lt-> length+= num;
}
void extendplace ( sqlist2 * lt) {
int n;
printf ( "请输入要扩容的数目:" ) ;
scanf ( "%d" , & n) ;
int * p;
p= lt-> data;
lt-> data = ( int * ) malloc ( ( lt-> max + n) * sizeof ( int ) ) ;
int i;
for ( i= 0 ; i< lt-> length; i++ ) {
lt-> data[ i] = p[ i] ;
}
lt-> max += n;
free ( p) ;
}
void insert_list2 ( sqlist2 * lt) {
int n, i, e;
printf ( "请输入要插入的下标 和 元素:" ) ;
scanf ( "%d %d" , & n, & e) ;
if ( n>= 0 && n<= lt-> length) {
if ( lt-> max== lt-> length) {
printf ( "当前表满,插入失败!" ) ;
}
else {
for ( i= lt-> length- 1 ; i>= n; i-- ) {
lt-> data[ i+ 1 ] = lt-> data[ i] ;
}
lt-> data[ n] = e;
lt-> length++ ;
}
}
else {
printf ( "有效下标在0到%d之间:" , lt-> length) ;
}
}
void print_list2 ( sqlist2 lt) {
int i;
if ( lt. length!= 0 ) {
printf ( "当前表中元素有:" ) ;
for ( i= 0 ; i< lt. length; i++ )
{
printf ( "%d\t" , lt. data[ i] ) ;
}
printf ( " 表长%d:\n" , lt. length) ;
}
else {
printf ( "当前为空表!" ) ;
}
printf ( "\n" ) ;
}
void find_list2 ( sqlist2 lt) {
int n, i, m, s;
s= 0 ;
printf ( "请输入要查找元素方式 1:下标 2:元素值:" ) ;
scanf ( "%d" , & n) ;
if ( n== 1 )
{
printf ( "请输入查找的元素下标:" ) ;
scanf ( "%d" , & m) ;
if ( m>= 0 && m<= lt. length- 1 ) {
printf ( "查找元素下标为%d的元素值为%d \n:" , m, lt. data[ m] ) ;
s= 1 ;
}
else {
printf ( "表中下标0到%d:" , lt. length- 1 ) ;
}
}
else if ( n== 2 )
{
printf ( "请输入要查找的元素值:" ) ;
scanf ( "%d" , & m) ;
for ( i= lt. length- 1 ; i>= 0 ; i-- )
{
if ( lt. data[ i] == m)
{
printf ( "元素下标为%d \n" , i) ;
s= 1 ;
break ;
}
}
}
else
{
printf ( "输入错误" ) ;
}
if ( s== 0 )
{
printf ( "未找到该元素,查找失败\n" ) ;
}
}
void delete_list2 ( sqlist2 * lt) {
int n, i, s, m, j;
s= 0 ;
printf ( "请输入要删除元素方式 1.下标 2.元素值:" ) ;
scanf ( "%d" , & n) ;
if ( n== 1 ) {
printf ( "请输入要删除的元素下标:" ) ;
scanf ( "%d" , & m) ;
if ( n>= 0 && m<= lt-> length- 1 ) {
printf ( "删除下标%d的元素值%d:\n:" , m, lt-> data[ m] ) ;
for ( i= m; i< lt-> length- 1 ; i++ )
{
lt-> data[ i] = lt-> data[ i+ 1 ] ;
}
lt-> length-- ;
s= 1 ;
}
else {
printf ( "表中下标0到%d:" , lt-> length- 1 ) ;
}
}
else if ( n== 2 )
{
printf ( "请输入要删除的元素值:" ) ;
scanf ( "%d" , & m) ;
for ( i= lt-> length- 1 ; i>= 0 ; i-- )
{
if ( lt-> data[ i] == m)
{
for ( j= i; j< lt-> length; j++ )
{
lt-> data[ j] = lt-> data[ j+ 1 ] ;
}
lt-> length-- ;
s= 1 ;
break ;
}
}
if ( s== 0 ) {
printf ( "无该元素" ) ;
}
}
else {
printf ( "输入错误" ) ;
}
}
void reback ( sqlist2 * lt) {
lt-> length= 0 ;
}
void destory ( sqlist2* lt) {
if ( lt-> data == NULL ) {
printf ( "销毁失败!/n" ) ;
return 0 ;
}
free ( lt-> data) ;
free ( lt) ;
printf ( "销毁成功!/n" ) ;
}
int main ( ) {
int num;
printf ( "输入创建表长:" ) ;
scanf ( "%d" , & num) ;
int n;
sqlist2 lt;
init_list2 ( & lt) ;
create_list2 ( & lt, num) ;
while ( 1 )
{
printf ( "输入要进行的操作:\n 1.查找 2.插入 3.删除: 4.扩容 5.表归零: 6.销毁表:" ) ;
scanf ( "%d" , & n) ;
if ( n== 0 ) { break ; }
switch ( n)
{
case ( 1 ) :
find_list2 ( lt) ;
break ;
case ( 3 ) :
delete_list2 ( & lt) ;
break ;
case ( 2 ) :
insert_list2 ( & lt) ;
break ;
case ( 4 ) :
extendplace ( & lt) ;
break ;
case ( 5 ) :
reback ( & lt) ;
break ;
case ( 6 ) :
destory ( & lt) ;
break ;
default :
printf ( "输入操作不存在!" ) ;
}
print_list2 ( lt) ;
printf ( "\n" ) ;
}
}
3.顺序表算法
1.(*与原题不一样)删除最小值并返回 后续元素全部进一
bool delete_min ( sqlist* lt, int * min) {
if ( lt-> length== 0 ) {
printf ( "当前为空表!" ) ;
return false;
}
int j= 0 ;
int e= lt-> data[ 0 ] ;
for ( int i= 1 ; i< lt-> length; i++ )
{
if ( lt-> data[ i] < e)
{
e= lt-> data[ i] ;
j= i;
}
}
for ( int i= j+ 1 ; i< lt-> length; i++ ) {
lt-> data[ i- 1 ] = lt-> data[ i] ;
}
lt-> length-- ;
* min = e;
return true;
}
2.逆置
void reverse_list ( sqlist* lt) {
int start = 0 ;
int end = lt-> length- 1 ;
int e= 0 ;
while ( start< end) {
e= lt-> data[ start] ;
lt-> data[ start] = lt-> data[ end] ;
lt-> data[ end] = e ;
start ++ ;
end-- ;
}
for ( start= 0 ; start< lt-> length; start++ ) {
printf ( "%d\t" , lt-> data[ start] ) ;
}
}
3.删除所有值为num的元素
void num_delete ( sqlist * lt, int e) {
int i, n= 0 ;
for ( i= 0 ; i< lt-> length; i++ ) {
if ( lt-> data[ i] != e) {
lt-> data[ n] = lt-> data[ i] ;
n++ ;
}
}
lt-> length= n;
for ( i= 0 ; i< lt-> length; i++ ) {
printf ( "%d\t" , lt-> data[ i] ) ;
}
}
4.有序表删除 s-t之间的元素,s、t不合理返回false
bool range_delete ( sqlist* lt, int start, int end) {
if ( start== end || start> end)
{
printf ( "删除不合法" ) ;
return false;
}
int i;
for ( i= 0 ; i< lt-> length; i++ ) {
if ( lt-> data[ i] == start) {
start = i;
}
if ( lt-> data[ i] == end) {
end= i;
}
}
int newlength = end- start+ 1 ;
for ( i= end+ 1 ; i< lt-> length; i++ ) {
lt-> data[ start++ ] = lt-> data[ i] ;
}
lt-> length -= newlength;
printf ( "%d\t%d删除后:" , start, end) ;
for ( i= 0 ; i< lt-> length; i++ ) {
printf ( "%d\t" , lt-> data[ i] ) ;
}
return true;
}
5.无序删除s-t 之间元素
bool no_sort_range_delete ( sqlist* lt, int start, int end) {
if ( start== end || start> end)
{
printf ( "删除不合法" ) ;
return false;
}
int i;
int num= 0 ;
for ( i= 0 ; i< lt-> length; i++ ) {
if ( start> lt-> data[ i] || lt-> data[ i] > end)
{
lt-> data[ num] = lt-> data[ i] ;
num++ ;
}
}
lt-> length= num;
for ( i= 0 ; i< lt-> length; i++ ) {
printf ( "%d\t" , lt-> data[ i] ) ;
}
return true;
}
6.有序表去重
bool Deduplicate ( sqlist * lt) {
if ( lt-> length== 0 ) {
return false;
}
int i= 0 ;
for ( int j= 1 ; j< lt-> length; j++ ) {
if ( lt-> data[ i] != lt-> data[ j] ) {
lt-> data[ ++ i] = lt-> data[ j] ;
}
}
lt-> length= i+ 1 ;
for ( int i= 0 ; i< lt-> length; i++ ) {
printf ( "%d\t" , lt-> data[ i] ) ;
}
return true;
}
7.合并有序表
bool merge_list ( sqlist * a, sqlist* b, sqlist* c) {
if ( a-> length== 0 || b-> length== 0 ) {
return false;
}
int i= 0 , j= 0 , k= 0 ;
while ( i< a-> length && j< b-> length) {
if ( a-> data[ i] < b-> data[ j] ) {
c-> data[ k++ ] = a-> data[ i++ ] ;
}
else {
c-> data[ k++ ] = b-> data[ j++ ] ;
}
}
while ( i< a-> length) {
c-> data[ k++ ] = a-> data[ i++ ] ;
}
while ( j< b-> length) {
c-> data[ k++ ] = b-> data[ j++ ] ;
}
c-> length= k;
return true;
}
8.互换a、b顺序表
void reverarray ( int arr[ ] , int start, int end) {
while ( start< end) {
int temp = arr[ start] ;
arr[ start++ ] = arr[ end] ;
arr[ end-- ] = temp;
}
}
void swapreverse ( int arr[ ] , int m, int n) {
reverarray ( arr, 0 , m- 1 ) ;
reverarray ( arr, m, m+ n- 1 ) ;
reverarray ( arr, 0 , m+ n- 1 ) ;
}
int main ( ) {
int arr[ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;
int m = 3 ;
int n = 7 ;
printf ( "Original Array: " ) ;
for ( int i = 0 ; i < m+ n; i++ ) {
printf ( "%d " , arr[ i] ) ;
}
printf ( "\n" ) ;
if ( m >= 0 && n >= 0 ) {
swapreverse ( arr, m, n) ;
for ( int i = 0 ; i < m+ n; i++ ) {
printf ( "%d " , arr[ i] ) ;
}
printf ( "\n" ) ;
}
return 0 ;
}
9(*参考代码插入未改变长度,添加 *lenggth)查找有序数组查找元素,找到与后继互换位置,未找到按顺序插入
void search_or_insert ( int arr[ ] , int * length, int e) {
int low= 0 , mid= 0 , end = * length- 1 ;
while ( low<= end) {
mid = ( low+ end) / 2 ;
if ( arr[ mid] == e) {
break ;
}
else if ( arr[ mid] < e) {
low = mid+ 1 ;
}
else {
end = mid- 1 ;
}
}
if ( arr[ mid] == e && mid!= * length- 1 ) {
int temp = arr[ mid] ;
arr[ mid] = arr[ mid+ 1 ] ;
arr[ mid+ 1 ] = temp;
}
if ( low> end) {
for ( int i= * length- 1 ; i> end; i-- ) {
arr[ i+ 1 ] = arr[ i] ;
}
arr[ end+ 1 ] = e;
( * length) ++ ;
}
}
int main ( ) {
int arr[ ] = { 1 , 2 , 5 , 7 , 8 } ;
int length = sizeof ( arr) / sizeof ( arr[ 0 ] ) ;
for ( int i= 0 ; i< length; i++ ) {
printf ( "%d\t" , arr[ i] ) ;
}
printf ( "\n" ) ;
search_or_insert ( arr, & length, 5 ) ;
for ( int i= 0 ; i< length; i++ ) {
printf ( "%d\t" , arr[ i] ) ;
}
return 0 ;
}
10.一维数组左移p位
void reverarray ( int arr[ ] , int start, int end) {
while ( start< end) {
int temp = arr[ start] ;
arr[ start] = arr[ end] ;
arr[ end] = temp;
start++ ; end-- ;
}
}
void test10 ( int arr[ ] , int p, int length) {
reverarray ( arr, 0 , p- 1 ) ;
printf ( "\n" ) ;
for ( int i= 0 ; i< 5 ; i++ ) {
printf ( "%d\t" , arr[ i] ) ;
}
reverarray ( arr, p, length- 1 ) ;
printf ( "\n" ) ;
for ( int i= 0 ; i< 5 ; i++ ) {
printf ( "%d\t" , arr[ i] ) ;
}
reverarray ( arr, 0 , length- 1 ) ;
}
int main ( ) {
int arr[ ] = { 1 , 2 , 3 , 4 , 5 } ;
test10 ( arr, 0 , 5 ) ;
printf ( "\n" ) ;
for ( int i= 0 ; i< 5 ; i++ ) {
printf ( "%d\t" , arr[ i] ) ;
}
return 0 ;
}
11.两个有序表一起的中位数
int test11 ( int a[ ] , int b[ ] , int length) {
int s1= 0 , s2= 0 , d1= length- 1 , d2= length- 1 , m1, m2;
while ( s1 != d1 || s2!= d2) {
m1 = ( s1+ d1) / 2 ;
m2 = ( s2+ d2) / 2 ;
printf ( "%d %d %d %d %d %d\n" , s1, d1, m1, s2, d2, m2) ;
if ( a[ m1] == b[ m2] ) {
return a[ m1] ;
}
if ( a[ m1] < b[ m2] )
{
if ( ( s1+ d1) % 2 == 0 ) {
s1 = m1;
d2 = m2;
}
else {
s1 = m1+ 1 ;
d2 = m2;
}
}
else
{
if ( ( s1+ d1) % 2 == 0 ) {
d1 = m1;
s2 = m2;
}
else {
d1 = m1;
s2 = m2+ 1 ;
}
}
}
return a[ s1] < b[ s2] ? a[ s1] : b[ s2] ;
}
12.判断无序数组中存在一个数存在个数大于2/n
int test12 ( int a[ ] , int n) {
int num= 1 ;
int temp= a[ 0 ] ;
for ( int i= 1 ; i< n; i++ ) {
if ( a[ i] == temp)
num++ ;
else if ( num>= n/ 2 )
break ;
else
{
if ( num> 0 )
num-- ;
else {
num= 1 ;
temp= a[ i] ;
}
}
printf ( "%d %d %d\n" , temp, a[ i] , num) ;
}
if ( num> 0 ) {
num= 0 ;
for ( int i= 0 ; i< n; i++ ) {
if ( a[ i] == temp) {
num++ ;
}
}
}
printf ( "最终%d %d\n" , temp, num) ;
return num> ( n/ 2 ) ? temp: - 1 ;
}
int main ( ) {
int arr[ ] = { 1 , 2 , 1 , 1 } ;
int num= test12 ( arr, 4 ) ;
printf ( "输出:%d" , num) ;
return 0 ;
}
13.无序数组寻找未出现最小正整数
int test13 ( int a[ ] , int n) {
int i, b[ n] ;
memset ( b, 0 , sizeof ( int ) * n) ;
int j= 1 ;
for ( i= 0 ; i< n; i++ ) {
if ( a[ i] > 0 && a[ i] <= n) {
b[ a[ i] - 1 ] = 1 ;
}
}
for ( i= 0 ; i< n; i++ ) {
if ( b[ i] == 0 )
break ;
}
return i+ 1 ;
}
int main ( ) {
int arr[ ] = { - 1 , 0 , 2 , 3 } ;
int num= test13 ( arr, 4 ) ;
printf ( "输出:%d" , num) ;
return 0 ;
}
14.三元组
int abs ( int a) {
if ( a< 0 )
a= - a;
return a;
}
bool num_min ( int a, int b, int c) {
if ( a<= b && a<= c)
return true;
return false;
}
int test14 ( int a[ ] , int b[ ] , int c[ ] , int num1, int num2, int num3) {
int i= 0 , j= 0 , k= 0 , temp= 0 ;
int min= abs ( a[ i] - b[ j] ) + abs ( a[ i] - c[ k] ) + abs ( b[ j] - c[ k] ) ;
while ( i< num1 && j< num2 && k< num3) {
temp= abs ( a[ i] - b[ j] ) + abs ( a[ i] - c[ k] ) + abs ( b[ j] - c[ k] ) ;
if ( temp< min)
min = temp;
if ( num_min ( a[ i] , b[ j] , c[ k] ) )
i++ ;
else if ( num_min ( b[ j] , a[ i] , c[ k] ) )
j++ ;
else k++ ;
}
return min;
}
int main ( ) {
int a[ ] = { - 1 , 0 , 9 } ;
int b[ ] = { - 25 , - 10 , 10 , 11 } ;
int c[ ] = { 2 , 9 , 17 , 30 , 4 } ;
int num= test14 ( a, b, c, 3 , 4 , 5 ) ;
printf ( "输出:%d" , num) ;
return 0 ;
}
二.链表
1.链表基本操作
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <stddef.h>
# include <malloc.h>
typedef struct node {
int data;
struct node * next;
} node, * linklist;
linklist init_list ( ) {
linklist lt = ( linklist) malloc ( sizeof ( node) ) ;
if ( lt== NULL ) {
printf ( "内存分配失败!\n" ) ;
return NULL ;
}
lt-> next = NULL ;
return lt;
}
void print_list ( linklist lt) {
lt = lt-> next;
if ( lt== NULL ) {
printf ( "当前为空表!\n" ) ;
return ;
}
printf ( "链表元素中有:" ) ;
while ( lt)
{
printf ( "%d\t" , lt-> data) ;
lt= lt-> next;
}
printf ( "\n" ) ;
}
void free_list ( linklist lt) {
node* current = lt;
while ( lt) {
current = lt;
lt = lt-> next;
free ( current) ;
}
}
linklist head_insert ( linklist lt) {
int n= 0 , e= 0 ;
printf ( "请输入要插入元素个数:" ) ;
scanf ( "%d" , & n) ;
printf ( "\t请输入插入的元素:" ) ;
for ( int i= 0 ; i< n; i++ )
{
node* s = ( node* ) malloc ( sizeof ( node) ) ;
scanf ( "%d" , & e) ;
s-> data = e;
s-> next = lt-> next;
lt-> next = s;
}
}
linklist back_insert ( linklist lt) {
int n= 0 , e= 0 ;
printf ( "请输入要插入元素个数:" ) ;
scanf ( "%d" , & n) ;
printf ( "\t请输入插入的元素:" ) ;
node * tail = lt;
for ( int i= 0 ; i< n; i++ )
{
node* s = ( node* ) malloc ( sizeof ( node) ) ;
scanf ( "%d" , & e) ;
s-> data = e;
tail-> next = s;
tail = s;
}
tail-> next= NULL ;
return lt;
}
linklist find_listnum ( linklist lt, int n) {
if ( n< 1 ) {
printf ( "查找结点输入有误!\n" ) ;
return NULL ;
}
int j= 1 ;
node * s= lt-> next;
while ( s!= NULL && j< n) {
s= s-> next;
j++ ;
}
if ( s== NULL ) {
printf ( "\t查找失败!超出链表长度\n" ) ;
return NULL ;
}
else {
printf ( "\t 按位查找成功!第%d个元素为:%d\n" , n, s-> data) ;
return s;
}
}
linklist find_listelem ( linklist lt, int e) {
node * s= lt-> next;
int j= 1 ;
while ( s!= NULL && s-> data!= e) {
s= s-> next;
j++ ;
}
if ( s!= NULL ) {
printf ( "\t按值查找成功!第%d个元素为:%d\n" , j, s-> data) ;
}
else {
printf ( "\t查找失败!超出链表长度\n" ) ;
}
}
linklist insert_num ( linklist lt, int e, int num) {
if ( num<= 0 ) {
printf ( "\t无效位置!\n" ) ;
return lt;
}
int j= 1 ;
node* s = lt;
while ( s!= NULL && j< num) {
j++ ;
s= s-> next;
}
if ( j!= num || s== NULL ) {
printf ( "插入位置无效!\n" ) ;
return lt;
}
node * temp= ( node* ) malloc ( sizeof ( node) ) ;
temp-> data= e;
temp-> next= s-> next;
s-> next= temp;
return lt;
}
linklist delete_node ( linklist lt, int n) {
if ( n<= 0 ) {
printf ( "无效位置!\n" ) ;
return lt;
}
if ( n== 1 && lt-> next!= NULL ) {
node * temp = lt-> next;
lt-> next = temp-> next;
free ( temp) ;
}
else {
node* s = find_listnum ( lt, n- 1 ) ;
if ( s== NULL || s-> next== NULL ) {
printf ( "删除位置无效!\n" ) ;
return lt;
}
node * temp = s-> next;
s-> next = temp-> next;
free ( temp) ;
}
return lt;
}
linklist linklist_length ( linklist lt) {
int n= 0 ;
for ( node* temp = lt-> next; temp!= NULL ; temp= temp-> next) {
n++ ;
}
printf ( "\t 表长:%d \n" , n) ;
return n;
}
int main ( )
{
linklist lt = init_list ( ) ;
back_insert ( lt) ;
print_list ( lt) ;
insert_num ( lt, 10 , 3 ) ;
print_list ( lt) ;
linklist_length ( lt) ;
print_list ( lt) ;
free_list ( lt) ;
return 0 ;
}
2.特殊链表
1.双链表
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <stddef.h>
# include <malloc.h>
typedef struct node {
int data;
struct node * prior, * next;
} dnode, * dlist;
dlist init_list ( ) {
dlist lt = ( dlist) malloc ( sizeof ( dnode) ) ;
if ( lt== NULL ) {
printf ( "内存分配失败!\n" ) ;
return NULL ;
}
lt-> next = NULL ;
lt-> prior = NULL ;
return lt;
}
dlist create_back ( dlist lt) {
printf ( "请输入要插入节点个数:" ) ;
int n = 0 , e= 0 ;
scanf ( "%d" , & n) ;
printf ( "\t 请依次输入输入插入的元素:" ) ;
dnode* tail= lt;
for ( int i= 0 ; i< n; i++ ) {
dnode* temp = ( dnode* ) malloc ( sizeof ( dnode) ) ;
scanf ( "%d" , & e) ;
temp-> data= e;
temp-> prior = tail;
tail-> next = temp;
tail = temp;
}
tail-> next= NULL ;
return lt;
}
void print_list ( dlist lt) {
lt = lt-> next;
if ( lt== NULL ) {
printf ( "当前为空表!\n" ) ;
return ;
}
printf ( "链表元素中有:" ) ;
while ( lt)
{
printf ( "%d\t" , lt-> data) ;
lt= lt-> next;
}
printf ( "\n" ) ;
}
void free_list ( dlist lt) {
dnode* current = lt;
while ( lt) {
current = lt;
lt = lt-> next;
free ( current) ;
}
}
dlist find_num ( dlist lt, int n) {
if ( n< 1 ) {
printf ( "查找结点输入有误!\n" ) ;
return NULL ;
}
int j= 1 ;
dnode * s= lt-> next;
while ( s!= NULL && j< n) {
s= s-> next;
j++ ;
}
if ( s== NULL ) {
printf ( "\t查找失败!超出链表长度\n" ) ;
return NULL ;
}
else {
printf ( "\t 按位查找成功!第%d个元素为:%d\n" , n, s-> data) ;
return s;
}
}
dlist insert_num ( dlist lt, int e, int num) {
if ( num<= 0 ) {
printf ( "无效位置!\n" ) ;
return lt;
}
int j= 1 ;
dnode* s = lt;
while ( s!= NULL && j< num) {
j++ ;
s= s-> next;
}
if ( j!= num || s== NULL ) {
printf ( "\t插入位置无效!\n" ) ;
return lt;
}
dnode * temp= ( dnode* ) malloc ( sizeof ( dnode) ) ;
temp-> data= e;
temp-> next= s-> next;
temp-> prior= s;
if ( s-> next== NULL ) {
s-> next= temp;
return lt;
}
s-> next-> prior = temp;
s-> next= temp;
return lt;
}
dlist delete_list ( dlist lt, int n) {
if ( n<= 0 ) {
printf ( "\t无效位置!\n" ) ;
return lt;
}
if ( n== 1 && lt-> next!= NULL ) {
dnode * temp = lt-> next;
lt-> next = temp-> next;
if ( temp-> next!= NULL ) {
temp-> next-> prior = lt ;
}
free ( temp) ;
}
else {
dnode* temp = find_num ( lt, n- 1 ) ;
if ( temp == NULL || temp-> next == NULL ) {
printf ( "\t超出链表长度范围!\n" ) ;
return lt;
}
dnode* target = temp-> next;
temp-> next = target-> next;
if ( target-> next!= NULL ) {
target-> next-> prior = temp ;
}
free ( target) ;
}
return lt;
}
int main ( )
{
dlist lt = init_list ( ) ;
create_back ( lt) ;
print_list ( lt) ;
delete_list ( lt, 2 ) ;
print_list ( lt) ;
return 0 ;
}
2.循环双链表
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <stddef.h>
# include <malloc.h>
typedef struct node {
int data;
struct node * prior, * next;
} cnode, * clist;
clist init_list ( ) {
clist lt = ( clist) malloc ( sizeof ( cnode) ) ;
if ( lt== NULL ) {
printf ( "内存分配失败!\n" ) ;
return NULL ;
}
lt-> next = lt;
lt-> prior = lt;
return lt;
}
bool empty ( clist lt) {
return ( lt-> next == lt) ;
}
void print_list ( clist lt) {
if ( ! empty ( lt) ) {
cnode* temp = lt-> next;
printf ( "循环双链表顺序打印元素有:" ) ;
while ( temp!= lt)
{
printf ( "\t%d" , temp-> data) ;
temp= temp-> next;
}
}
else {
printf ( "\t当前为空表!\n" ) ;
}
printf ( "\n" ) ;
}
void print_reverse_list ( clist lt) {
if ( ! empty ( lt) ) {
cnode* temp = lt-> prior;
printf ( "循环双链表逆序打印元素有:" ) ;
while ( temp != lt)
{
printf ( "\t%d" , temp-> data) ;
temp= temp-> prior;
}
}
else {
printf ( "\t当前为空表!\n" ) ;
}
printf ( "\n" ) ;
}
int length_list ( clist lt) {
if ( ! empty ( lt) ) {
cnode* temp = lt;
int num= 0 ;
while ( temp-> next!= lt)
{
temp= temp-> next;
num++ ;
}
return num;
}
return 0 ;
}
void free_list ( clist lt) {
cnode* current = lt;
while ( lt) {
current = lt;
lt = lt-> next;
free ( current) ;
}
}
clist back_create ( clist lt) {
int n= 0 , e= 0 ;
printf ( "请输入要插入元素个数:" ) ;
scanf ( "%d" , & n) ;
printf ( "\t请输入插入的元素:" ) ;
cnode * temp = lt
;
for ( int i= 0 ; i< n; i++ )
{
cnode* s = ( cnode* ) malloc ( sizeof ( cnode) ) ;
scanf ( "%d" , & e) ;
s-> data = e;
temp-> next= s;
s-> prior= temp;
temp= s;
}
lt-> prior= temp;
temp-> next= lt;
return lt;
}
clist insert_num ( clist lt, int e , int n) {
if ( n<= 0 || n> length_list ( lt) + 1 ) {
printf ( "\t无效位置!\n" ) ;
return lt;
}
int j= 1 ;
cnode* s = lt;
while ( s-> next!= lt && j< n) {
j++ ;
s= s-> next;
}
cnode * temp= ( cnode* ) malloc ( sizeof ( cnode) ) ;
temp-> data = e;
if ( n== 1 ) {
temp-> next= s-> next;
s-> next-> prior = temp;
s-> next = temp;
temp-> prior = s;
return lt;
}
else if ( n== length_list ( lt) + 1 ) {
temp-> prior= s;
temp-> next= lt;
lt-> prior= temp;
s-> next = temp;
return lt;
}
temp-> next = s-> next;
s-> next-> prior = temp;
temp-> prior= s;
s-> next= temp;
return lt;
}
clist delete_num ( clist lt, int n) {
if ( n< 1 || n> length_list ( lt) ) {
printf ( " \t无效位置!\n" ) ;
return lt;
}
cnode * temp = lt-> next;
if ( n== 1 ) {
if ( length_list ( lt) == 1 ) {
lt-> next= lt;
lt-> prior= lt;
}
else {
temp-> next-> prior= lt ;
lt-> next = temp-> next;
}
}
else if ( n== length_list ( lt) ) {
temp = temp-> prior-> prior;
lt-> prior = temp-> prior;
temp-> prior-> next= lt;
}
else {
int j= 1 ;
while ( temp!= lt && j< n) {
temp= temp-> next;
j++ ;
}
temp-> next-> prior= temp-> prior;
temp-> prior-> next= temp-> next;
}
free ( temp) ;
return lt;
}
int main ( ) {
clist lt = init_list ( ) ;
back_create ( lt) ;
print_list ( lt) ;
print_reverse_list ( lt) ;
delete_num ( lt, 3 ) ;
print_list ( lt) ;
free_list ( lt) ;
return 0 ;
}
3.静态链表
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <stddef.h>
# include <malloc.h>
# define max 5
typedef struct node {
int data;
int next;
} node, jlist[ max] ;
void init_list ( jlist lt) {
lt[ 0 ] . next= - 1 ;
for ( int i= 1 ; i< max; i++ ) {
lt[ i] . next= - 2 ;
}
}
bool empty_list ( jlist lt) {
return ( lt[ 0 ] . next== - 1 ) ;
}
void print_list ( jlist lt) {
if ( lt[ 0 ] . next!= - 1 ) {
int i= 0 ;
printf ( "当前表中元素有:" ) ;
while ( lt[ i] . next!= - 1 )
{
i= lt[ i] . next;
printf ( "\t%d " , lt[ i] . data) ;
}
}
else {
printf ( "\t当前为空表!\n" ) ;
}
printf ( "\n" ) ;
}
void create_list ( jlist lt) {
printf ( "请输入要创建表长:" ) ;
int n= 0 , e= 0 , i;
scanf ( "%d" , & n) ;
printf ( "\t请依次输入元素:" ) ;
lt[ 0 ] . next= 1 ;
for ( i= 1 ; i<= n; i++ ) {
scanf ( "%d" , & e) ;
lt[ i] . data= e;
lt[ i] . next= i+ 1 ;
}
lt[ i- 1 ] . next= - 1 ;
}
int find_num ( jlist lt , int n) {
if ( n<= 0 || n>= max) {
printf ( "\t 无效位置!\n" ) ;
return - 2 ;
}
else {
if ( ! empty_list ( lt) ) {
int i= lt[ 0 ] . next;
int num= 1 ;
while ( lt[ i] . next != - 1 && num< n) {
num++ ;
i= lt[ i] . next;
}
if ( n== num && lt[ n] . next!= - 2 ) {
return i;
}
}
return - 1 ;
}
}
int length_list ( jlist lt) {
int i= 0 , count= 0 ;
while ( lt[ i] . next!= - 1 )
{
i= lt[ i] . next;
count++ ;
}
return count;
}
void insert_num ( jlist lt, int e, int n) {
if ( length_list ( lt) < 1 || n> length_list ( lt) + 1 || n>= max) {
printf ( " \t 无效位置!\n" ) ;
}
else {
int i= 0 , count= 0 , j= 0 ;
while ( lt[ i] . next!= - 2 ) {
i++ ;
}
lt[ i] . data = e;
while ( lt[ j] . next!= - 1 && count< n- 1 ) {
j= lt[ j] . next;
count++ ;
}
lt[ i] . next = lt[ j] . next;
lt[ j] . next= i;
}
}
void delete_num ( jlist lt, int n) {
if ( n< 1 || n> length_list ( lt) ) {
printf ( "\t 无效位置!\n" ) ;
}
else {
int i= 0 , count= 0 ;
while ( count< n- 1 ) {
i= lt[ i] . next;
count++ ;
}
count = lt[ i] . next;
lt[ i] . next = lt[ count] . next;
lt[ count] . next= - 2 ;
}
}
int main ( )
{
jlist lt ;
init_list ( lt) ;
create_list ( lt) ;
print_list ( lt) ;
delete_num ( lt, 3 ) ;
print_list ( lt) ;
return 0 ;
}
3. 链表算法
1.
# include <stdio.h>
# include <stdlib.h>
typedef struct node {
int data;
struct node * next;
} node, * linklist;
linklist init_list ( ) {
return NULL ;
}
linklist back_create ( linklist lt) {
int n = 0 , e = 0 ;
printf ( "请输入要插入元素个数:" ) ;
scanf ( "%d" , & n) ;
printf ( "\t请输入插入的元素:" ) ;
linklist tail = lt;
for ( int i = 0 ; i < n; i++ ) {
linklist s = ( linklist) malloc ( sizeof ( node) ) ;
scanf ( "%d" , & e) ;
s-> data = e;
s-> next = NULL ;
if ( tail == NULL ) {
lt = s;
tail = s;
} else {
tail-> next = s;
tail = s;
}
}
return lt;
}
void print_list ( linklist lt) {
linklist current = lt;
if ( current == NULL ) {
printf ( "当前为空表!\n" ) ;
return ;
}
printf ( "链表元素中有:" ) ;
while ( current) {
printf ( "%d\t" , current-> data) ;
current = current-> next;
}
printf ( "\n" ) ;
}
linklist delete_value ( linklist lt, int x) {
if ( lt == NULL ) {
return NULL ;
}
if ( lt-> data == x) {
linklist temp = lt;
lt = lt-> next;
free ( temp) ;
lt = delete_value ( lt, x) ;
} else {
lt-> next = delete_value ( lt-> next, x) ;
}
return lt;
}
void free_list ( linklist lt) {
linklist current = lt;
while ( current) {
linklist temp = current;
current = current-> next;
free ( temp) ;
}
}
int main ( ) {
linklist lt = init_list ( ) ;
lt = back_create ( lt) ;
print_list ( lt) ;
int x;
printf ( "请输入要删除的值x:" ) ;
scanf ( "%d" , & x) ;
lt = delete_value ( lt, x) ;
print_list ( lt) ;
free_list ( lt) ;
return 0 ;
}
2.
# include <stdio.h>
# include <stdlib.h>
typedef struct node {
int data;
struct node * next;
} node, * linklist;
linklist init_list ( ) {
linklist lt = ( linklist) malloc ( sizeof ( node) ) ;
if ( lt== NULL ) {
printf ( "内存分配失败!\n" ) ;
return NULL ;
}
lt-> next = NULL ;
return lt;
}
linklist back_create ( linklist lt) {
int n = 0 , e = 0 ;
printf ( "请输入要插入元素个数:" ) ;
scanf ( "%d" , & n) ;
printf ( "\t请输入插入的元素:" ) ;
linklist tail = lt;
for ( int i = 0 ; i < n; i++ ) {
linklist s = ( linklist) malloc ( sizeof ( node) ) ;
scanf ( "%d" , & e) ;
s-> data = e;
s-> next = NULL ;
tail-> next = s;
tail = s;
}
return lt;
}
void print_list ( linklist lt) {
linklist current = lt-> next;
if ( current == NULL ) {
printf ( "当前为空表!\n" ) ;
return ;
}
printf ( "链表元素中有:" ) ;
while ( current) {
printf ( "%d\t" , current-> data) ;
current = current-> next;
}
printf ( "\n" ) ;
}
linklist delete_value ( linklist lt, int x) {
if ( lt == NULL ) {
return NULL ;
}
if ( lt-> data == x) {
linklist temp = lt;
lt = lt-> next;
free ( temp) ;
lt = delete_value ( lt, x) ;
} else {
lt-> next = delete_value ( lt-> next, x) ;
}
return lt;
}
void delete_num ( linklist lt, int num) {
linklist current = lt;
while ( current-> next) {
if ( current-> next-> data == num) {
linklist temp = current-> next;
current-> next = temp-> next;
free ( temp) ;
} else {
current = current-> next;
}
}
}
void free_list ( linklist lt) {
linklist current = lt;
while ( current) {
linklist temp = current;
current = current-> next;
free ( temp) ;
}
}
int main ( ) {
linklist lt = init_list ( ) ;
lt = back_create ( lt) ;
print_list ( lt) ;
int x;
printf ( "请输入要删除的值x:" ) ;
scanf ( "%d" , & x) ;
delete_num ( lt, x) ;
print_list ( lt) ;
free_list ( lt) ;
return 0 ;
}
3.
void reverse_print ( linklist lt) {
if ( lt== NULL ) {
return ;
}
reverse_print ( lt-> next) ;
if ( lt-> data != - 1 ) {
printf ( "\t%d" , lt-> data) ;
}
}
void reverse_print1 ( linklist lt) {
if ( lt == NULL ) {
return ;
}
if ( lt-> next != NULL ) {
reverse_print ( lt-> next) ;
}
if ( lt-> data != - 1 ) {
printf ( "\t%d" , lt-> data) ;
}
}
4.
void delete_num ( linklist lt) {
if ( lt-> next== NULL ) {
return ;
}
linklist minpre = lt;
linklist temp = lt;
linklist min = lt-> next;
while ( temp-> next!= NULL ) {
if ( temp-> next-> data < min-> data) {
minpre = temp;
min= temp-> next;
}
temp = temp-> next;
}
minpre-> next = min-> next;
free ( min) ;
}
5.
void reverse_list ( linklist lt) {
if ( lt-> next== NULL | lt-> next-> next== NULL ) {
return ;
}
node* pre= NULL ;
node* temp= lt-> next;
node* next= temp-> next;
while ( next != NULL ) {
temp-> next = pre;
pre = temp;
temp = next;
next = next-> next;
}
temp-> next = pre;
lt-> next= temp;
}
6. 使单链表递增有序
void test6 ( linklist lt) {
node* temp = lt-> next, * pre;
node* next = temp-> next;
temp-> next = NULL ;
temp = next;
while ( temp!= NULL ) {
next = temp-> next;
pre = lt;
while ( pre-> next!= NULL && pre-> next-> data < temp-> data)
pre = pre-> next;
temp-> next = pre-> next;
pre-> next = temp;
temp = next;
}
}
7. 删除带头节点单链表中节点值在a、b之间的节点
void test7 ( linklist lt, int min , int max) {
node* pre= lt, * temp = lt-> next;
while ( temp!= NULL ) {
if ( temp-> data >= min && temp-> data<= max) {
pre-> next = temp-> next;
free ( temp) ;
temp = pre-> next;
}
else {
pre = temp;
temp = temp-> next;
}
}
}
8.两个链表公共结点
int list_length ( linklist lt) {
int num= - 1 ;
while ( lt!= NULL ) {
lt= lt-> next;
num+= 1 ;
}
return num;
}
linklist test8 ( linklist a, linklist b) {
int n= list_length ( a) ;
int m= list_length ( b) ;
printf ( "%d %d\t" , n, m) ;
linklist list1, list2;
int num;
if ( n> m) {
list1 = a-> next;
list2 = b-> next;
num = n- m;
}
else {
list1 = b-> next;
list2 = a-> next;
num= m- n;
}
while ( num-- ) {
list1 = list1-> next;
}
while ( list1!= NULL && list2!= NULL ) {
if ( list1 == list2) {
return list1;
}
else {
list1 = list1-> next;
list2 = list2-> next;
}
}
return NULL ;
}
int main ( ) {
linklist lt = init_list ( ) ;
back_create ( lt) ;
print_list ( lt) ;
linklist lt2 = init_list ( ) ;
back_create ( lt2) ;
print_list ( lt2) ;
node * temp = lt2;
while ( temp-> next!= NULL ) {
temp= temp-> next;
}
temp-> next= lt-> next;
printf ( "%d" , temp-> data) ;
print_list ( lt2) ;
linklist lt3 = test8 ( lt, lt2) ;
printf ( "公共节点:" ) ;
while ( lt3 != NULL ) {
printf ( "\t%d" , lt3-> data) ;
lt3= lt3-> next;
}
free_list ( lt) ;
return 0 ;
}
9.依次删除最小值节点至空表
void test9 ( linklist head) {
while ( head-> next!= NULL ) {
node* pre = head;
node* temp = pre-> next;
node* minpre= pre;
node* min = temp;
while ( temp-> next != NULL ) {
if ( temp-> next-> data < min-> data) {
minpre = temp;
min = temp-> next;
}
temp = temp-> next;
}
printf ( "\t%d" , min-> data) ;
minpre-> next = min-> next;
free ( min) ;
}
}
10.单链表拆分成两个按照奇偶性
linklist test10 ( linklist lt) {
linklist lt2 = init_list ( ) ;
node * temp1= lt;
node * temp2= lt2;
node * temp= lt-> next;
lt-> next= NULL ;
int count= 1 ;
while ( temp!= NULL ) {
if ( count% 2 == 0 ) {
temp2-> next = temp;
temp2 = temp;
}
else {
temp1-> next= temp;
temp1= temp;
}
temp = temp-> next;
count++ ;
}
temp2-> next = NULL ;
temp1-> next = NULL ;
return lt2;
}
int main ( ) {
linklist lt = init_list ( ) ;
back_create ( lt) ;
print_list ( lt) ;
node* lt2 = test10 ( lt) ;
print_list ( lt) ;
print_list ( lt2) ;
return 0 ;
}
11.拆表
linklist test11 ( linklist lt) {
linklist lt2= init_list ( ) ;
node* temp = lt-> next;
node* temp1 = lt;
node* temp2 = lt2;
node* temp3;
while ( temp!= NULL ) {
temp1-> next= temp;
temp1 = temp;
temp = temp-> next;
if ( temp!= NULL ) {
temp3 = temp-> next;
temp-> next = temp2-> next;
temp2-> next= temp;
temp = temp3;
}
}
temp1-> next= NULL ;
return lt2;
}
12.递增有序去重
void test12 ( linklist lt) {
node* temp = lt-> next;
node* p;
if ( temp== NULL ) {
return ;
}
while ( temp-> next!= NULL ) {
p= temp-> next;
if ( temp-> data == p-> data) {
temp-> next= p-> next;
free ( p) ;
}
else {
temp = temp-> next;
}
}
}
13.两条递增链表合并成一条从大到小的链表
void test13 ( linklist lt, linklist lt2) {
node * temp1= lt-> next;
node * temp2 = lt2-> next;
node * temp3 = lt;
temp3-> next= NULL ;
node* temp4;
while ( temp1!= NULL && temp2!= NULL ) {
if ( temp1-> data <= temp2-> data) {
temp4= temp1-> next;
temp1-> next= temp3-> next;
temp3-> next = temp1;
temp1 = temp4;
}
else {
temp4= temp2-> next;
temp2-> next= temp3-> next;
temp3-> next = temp2;
temp2 = temp4;
}
}
if ( temp1== NULL ) {
temp1 = temp2;
}
while ( temp1!= NULL ) {
temp4= temp1-> next;
temp1-> next= temp3-> next;
temp3-> next = temp1;
temp1 = temp4;
}
free ( lt2) ;
}
14.两链表公共元素不破坏原表(懒得写)
15.两链表公共元素 (目的表为表一)
linklist test15 ( linklist lt, linklist lt2) {
node * temp1= lt-> next;
node * temp2 = lt2-> next;
node* temp3= lt;
node* temp4;
while ( temp1!= NULL && temp2!= NULL )
{
if ( temp1-> data < temp2-> data) {
temp4= temp1;
temp1 = temp1-> next;
free ( temp4) ;
}
else if ( temp1-> data > temp2-> data) {
temp4= temp2;
temp2 = temp2-> next;
free ( temp4) ;
}
else {
temp3-> next= temp1;
temp3= temp1;
temp1= temp1-> next;
}
}
temp3-> next= NULL ;
while ( temp1!= NULL ) {
temp4= temp1;
temp1 = temp1-> next;
free ( temp4) ;
}
while ( temp2!= NULL ) {
temp4= temp2;
temp2 = temp2-> next;
free ( temp4) ;
}
free ( lt2) ;
return lt;
}
16.判断是否是连续子序列
int test16 ( linklist list1, linklist list2) {
node * p1 = list1-> next;
node * p2 = list2-> next;
node * start = NULL ;
while ( p1 && p2) {
if ( p1-> data == p2-> data) {
if ( ! start) {
start = p1;
}
p1 = p1-> next;
p2 = p2-> next;
} else {
p1 = start-> next;
p2 = list2-> next;
start = NULL ;
}
if ( ! p2) {
printf ( "\t是\n" ) ;
return 1 ;
}
}
printf ( "\t不是\n" ) ;
return 0 ;
}
17.循环双链表判断是否对称
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <stddef.h>
# include <malloc.h>
typedef struct node {
int data;
struct node * prior, * next;
} cnode, * clist;
clist init_list ( ) {
clist lt = ( clist) malloc ( sizeof ( cnode) ) ;
if ( lt== NULL ) {
printf ( "内存分配失败!\n" ) ;
return NULL ;
}
lt-> next = lt;
lt-> prior = lt;
return lt;
}
bool empty ( clist lt) {
return ( lt-> next == lt) ;
}
void print_list ( clist lt) {
if ( ! empty ( lt) ) {
cnode* temp = lt-> next;
printf ( "循环双链表顺序打印元素有:" ) ;
while ( temp!= lt)
{
printf ( "\t%d" , temp-> data) ;
temp= temp-> next;
}
}
else {
printf ( "\t当前为空表!\n" ) ;
}
printf ( "\n" ) ;
}
clist back_create ( clist lt) {
int n= 0 , e= 0 ;
printf ( "请输入要插入元素个数:" ) ;
scanf ( "%d" , & n) ;
printf ( "\t请输入插入的元素:" ) ;
cnode * temp = lt;
for ( int i= 0 ; i< n; i++ )
{
cnode* s = ( cnode* ) malloc ( sizeof ( cnode) ) ;
scanf ( "%d" , & e) ;
s-> data = e;
temp-> next= s;
s-> prior= temp;
temp= s;
}
lt-> prior= temp;
temp-> next= lt;
return lt;
}
int test17 ( clist lt) {
cnode* temp1= lt-> next;
cnode* temp2= lt-> prior;
while ( temp1!= temp2 && temp1-> next!= temp2) {
if ( temp1-> data == temp2-> data) {
temp1= temp1-> next;
temp2= temp2-> prior;
}
else {
printf ( "\t 失败\n" ) ;
return 0 ;
}
}
printf ( "\t 是\n" ) ;
return 1 ;
}
int main ( ) {
clist lt = init_list ( ) ;
back_create ( lt) ;
print_list ( lt) ;
test17 ( lt) ;
print_list ( lt) ;
return 0 ;
}
18.合并单循环链表 (我写的双循序)
void test18 ( clist lt, clist lt2) {
cnode* temp1 = lt-> prior;
cnode* temp2 = lt2-> prior;
temp1-> next= lt2-> next;
lt-> prior= temp2;
temp2-> next= lt;
lt2-> next-> prior= temp1;
free ( lt2) ;
}
19.
void test19 ( linklist lt) {
node * p, * pre, * min, * minpre;
while ( lt-> next != NULL ) {
p= lt-> next;
pre= lt;
min = p;
minpre= pre;
while ( p!= lt) {
if ( p-> data < min-> data) {
min = p;
minpre= pre;
}
pre = p;
p= p-> next;
}
printf ( "\t %d " , min-> data) ;
minpre-> next = min-> next;
free ( min) ;
}
free ( lt) ;
}
21. 判断有环 (书上代码c+++)
linklist test21 ( linklist lt) {
node* fast = lt;
node* slow = lt;
while ( fast!= NULL && fast-> next!= NULL ) {
slow = slow-> next;
fast = fast-> next-> next;
if ( slow == fast) break ;
}
if ( fast== NULL || fast-> next== NULL )
return NULL ;
node * p1= lt; node* p2 = slow;
while ( p1!= p2) {
p1 = p1-> next;
p2 = p2-> next;
}
return p1;
}
22.寻找单链表倒数第k个节点
int test22 ( linklist lt, int num) {
node * pre= lt;
node * p= lt;
int count= 0 ;
while ( p!= NULL ) {
p= p-> next;
count++ ;
if ( count == num) break ;
}
if ( count < num || num< 1 ) {
return 0 ;
}
while ( p!= NULL ) {
pre = pre-> next;
p = p-> next;
}
return pre;
}
int main ( )
{
linklist lt = init_list ( ) ;
back_insert ( lt) ;
print_list ( lt) ;
node * p= test22 ( lt, 2 ) ;
printf ( "%d" , p-> data) ;
free_list ( lt) ;
return 0 ;
}
23.查找两单链表公共序列首节点
linklist test23 ( linklist lt, linklist lt2) {
int len1= linklist_length ( lt) ;
int len2= linklist_length ( lt2) ;
node* temp1= lt;
node* temp2= lt2;
for ( temp1; len1> len2; len1-- ) {
temp1= temp1-> next;
}
for ( temp2; len1< len2; len2-- ) {
temp2= temp2-> next;
}
while ( temp1-> next != NULL && temp1-> next!= temp2-> next) {
temp1= temp1-> next;
temp2= temp2-> next;
}
return temp1-> next;
}
int main ( )
{
linklist lt = init_list ( ) ;
back_insert ( lt) ;
print_list ( lt) ;
linklist lt2 = init_list ( ) ;
back_insert ( lt2) ;
node* temp= lt2;
while ( temp-> next!= NULL ) {
temp= temp-> next;
}
temp-> next= lt-> next;
print_list ( lt2) ;
node * p= test23 ( lt, lt2) ;
printf ( "%d" , p-> data) ;
free_list ( lt) ;
return 0 ;
}
24.去重
linklist test24 ( linklist lt, int n) {
int nums[ n] ;
for ( int i= 0 ; i< n; i++ ) {
nums[ i] = 0 ;
}
int num;
node * temp= lt;
node * freetemp;
while ( temp-> next != NULL ) {
num = temp-> next-> data > 0 ? temp-> next-> data : - temp-> next-> data;
printf ( "\t %d" , num) ;
if ( nums[ num] == 0 ) {
nums[ num] = 1 ;
temp = temp-> next;
}
else {
freetemp = temp-> next;
temp-> next = freetemp-> next;
free ( freetemp) ;
}
}
}
25.链表位置改变
void test25 ( linklist lt) {
node* temp1= lt;
node* temp2= lt;
node* temp3= ( node* ) malloc ( sizeof ( node) ) ;
node* temp4= ( node* ) malloc ( sizeof ( node) ) ;
while ( temp2-> next!= NULL ) {
temp1= temp1-> next;
temp2= temp2-> next;
if ( temp2-> next != NULL ) temp2 = temp2-> next;
}
temp2 = temp1-> next;
temp1-> next = NULL ;
temp3-> next= NULL ;
while ( temp2!= NULL ) {
temp4= temp2-> next;
temp2-> next= temp3-> next;
temp3-> next = temp2;
temp2= temp4;
}
temp1= lt-> next;
temp2= temp3-> next;
while ( temp2!= NULL ) {
temp4= temp2-> next;
temp2-> next= temp1-> next;
temp1-> next= temp2;
temp1= temp2-> next;
temp2= temp4;
}
}
---------后续都是链接 点两次---------------------