2-5编写算法,在单链表中查找第一值为x的结点,并输出其前驱和后继的存储位置
# include <stdio.h>
# include <stdlib.h> typedef int DataType;
struct Node
{ DataType data; struct Node * next;
} ;
typedef struct Node * PNode;
typedef struct Node * LinkList; LinkList SetNullList_Link ( )
{ LinkList head = ( LinkList) malloc ( sizeof ( struct Node ) ) ; if ( head != NULL ) head-> next = NULL ; else printf ( "alloc failure" ) ; return head;
} void CreateList_Tail ( struct Node * head)
{ PNode p = NULL ; PNode q = head; DataType data; scanf ( "%d" , & data) ; while ( data != - 1 ) { p = ( struct Node * ) malloc ( sizeof ( struct Node ) ) ; p-> data = data; p-> next = NULL ; q-> next = p; q = p; scanf ( "%d" , & data) ; }
}
int Inserch_num ( LinkList head, int x)
{ LinkList p; int i= 0 ; p= head-> next; while ( p) { if ( i== 0 && p-> data== x) { printf ( "The Prodrove node is head,the position of the rear node is at position 2 of the linked list\n" ) ; return 0 ; } if ( p-> data== x&& p-> next== NULL ) { printf ( "The Prodrove node is %d,there is no rear node\n " , i) ; return 0 ; } if ( p-> data== x) { printf ( "The Prodrove node is %d,he rear node is %d\n" , i, i+ 2 ) ; return 0 ; } i++ ; p = p-> next; } return 0 ;
}
void print ( LinkList head)
{ PNode p = head-> next; while ( p) { printf ( "%d " , p-> data) ; p = p-> next; }
}
void DestoryList_Link ( LinkList head)
{ PNode pre = head; PNode p = pre-> next; while ( p) { free ( pre) ; pre = p; p = pre-> next; } free ( pre) ;
} int main ( )
{ LinkList head = NULL ; int x= 0 , a= 0 ; head = SetNullList_Link ( ) ; CreateList_Tail ( head) ; print ( head) ; printf ( "\n" ) ; printf ( "Please input the number you find:" ) ; scanf ( "%d" , & x) ; a= x; Inserch_num ( head, a) ; DestoryList_Link ( head) ; return 0 ;
}
2-6在单循环链表中,编写算法实现将链表中数据域为奇数的结点移至表头,将链表中数据域为偶数的结点移至表尾
# include <stdio.h>
# include <stdlib.h> typedef int DataType;
struct Node { DataType data; struct Node * next;
} ;
typedef struct Node * PNode;
typedef struct Node * LinkList; LinkList CreateList_Tail_loop ( )
{ LinkList head = ( LinkList) malloc ( sizeof ( struct Node ) ) ; PNode cur = NULL ; PNode tail = head; DataType data; scanf ( "%d" , & data) ; while ( data != - 1 ) { cur = ( struct Node * ) malloc ( sizeof ( struct Node ) ) ; cur-> data = data; tail-> next = cur; tail = cur; scanf ( "%d" , & data) ; } tail-> next = head; return tail;
}
PNode Move_Odd_Even ( LinkList tail)
{ PNode head= tail-> next, pre= head-> next, q= pre-> next; PNode pre1, head1= ( PNode) malloc ( sizeof ( struct Node ) ) ; PNode pre2, head2= ( PNode) malloc ( sizeof ( struct Node ) ) ; pre1= head1; pre2= head2; while ( q!= head-> next) { if ( pre-> data% 2 == 0 ) { pre-> next= pre1-> next; pre1-> next= pre; pre1= pre; } else { pre-> next= pre2; pre2-> next= pre; pre2= pre; } pre= q; q= q-> next; }
head1= head1-> next;
pre2-> next= head1;
pre1-> next= head2;
return pre1;
}
void print ( LinkList tail)
{ PNode head = tail-> next; PNode p = head-> next; while ( p != head) { printf ( "%d " , p-> data) ; p = p-> next; }
} void DestoryList_Link ( LinkList tail)
{ PNode pre = tail-> next; PNode p = pre-> next; while ( p != tail) { free ( pre) ; pre = p; p = pre-> next; } free ( pre) ; free ( tail) ;
} int main ( )
{ LinkList tail = NULL ; LinkList p = NULL ; tail = CreateList_Tail_loop ( ) ; p = Move_Odd_Even ( tail) ; print ( p) ; DestoryList_Link ( tail) ; return 0 ;
}
2-7将两个有序线性表LIST1=(a1,a2,…,an)和LIST2=(b1,b2,…,bn)链接成一个有序线性链表LIST3,并删除LIST3链表中相同的结点,即链接中若有多个结点具有相同的数据域,只保留一个结点,使得顺序表中所有结点的数据域都不相同。在采用顺序表和单链表两种形式下分别设计算法实现上述功能
# include <stdio.h>
# include <stdlib.h> # define MAX_SIZE 100 void mergeAndRemoveDuplicates ( int list1[ ] , int list2[ ] , int n1, int n2, int list3[ ] ) { int i = 0 , j = 0 , k = 0 ; while ( i < n1 && j < n2) { if ( list1[ i] < list2[ j] ) { list3[ k] = list1[ i] ; i++ ; k++ ; } else if ( list1[ i] > list2[ j] ) { list3[ k] = list2[ j] ; j++ ; k++ ; } else { list3[ k] = list1[ i] ; i++ ; j++ ; k++ ; } } while ( i < n1) { list3[ k] = list1[ i] ; i++ ; k++ ; } while ( j < n2) { list3[ k] = list2[ j] ; j++ ; k++ ; }
} void removeDuplicates ( int list[ ] , int size) { int i, j, k; for ( i = 0 ; i < size; i++ ) { for ( j = i + 1 ; j < size; ) { if ( list[ j] == list[ i] ) { for ( k = j; k < size - 1 ; k++ ) { list[ k] = list[ k + 1 ] ; } size-- ; } else { j++ ; } } }
} int main ( ) { int i = 0 ; int list1[ ] = { 1 , 2 , 3 , 5 , 7 } ; int list2[ ] = { 3 , 4 , 5 , 6 , 8 } ; int n1 = sizeof ( list1) / sizeof ( list1[ 0 ] ) ; int n2 = sizeof ( list2) / sizeof ( list2[ 0 ] ) ; int list3[ MAX_SIZE] ; mergeAndRemoveDuplicates ( list1, list2, n1, n2, list3) ; removeDuplicates ( list3, n1 + n2) ; printf ( "Merged and duplicates removed list: " ) ; for ( i = 0 ; i < 8 ; i++ ) { printf ( "%d \n" , list3[ i] ) ; } printf ( "\n" ) ; return 0 ;
}
# include <stdio.h>
# include <stdlib.h> struct ListNode { int val; struct ListNode * next;
} ; struct ListNode * createNode ( int val) { struct ListNode * newNode = ( struct ListNode * ) malloc ( sizeof ( struct ListNode ) ) ; newNode-> val = val; newNode-> next = NULL ; return newNode;
} struct ListNode * mergeAndRemoveDuplicates ( struct ListNode * list1, struct ListNode * list2) { struct ListNode * p = list1; struct ListNode * q = list2; struct ListNode * list3 = NULL ; struct ListNode * tail = NULL ; while ( p && q) { if ( p-> val < q-> val) { if ( list3 == NULL ) { list3 = tail = createNode ( p-> val) ; } else { tail-> next = createNode ( p-> val) ; tail = tail-> next; } p = p-> next; } else if ( p-> val > q-> val) { if ( list3 == NULL ) { list3 = tail = createNode ( q-> val) ; } else { tail-> next = createNode ( q-> val) ; tail = tail-> next; } q = q-> next; } else { if ( list3 == NULL ) { list3 = tail = createNode ( p-> val) ; } else { tail-> next = createNode ( p-> val) ; tail = tail-> next; } p = p-> next; q = q-> next; } } while ( p) { tail-> next = createNode ( p-> val) ; tail = tail-> next; p = p-> next; } while ( q) { tail-> next = createNode ( q-> val) ; tail = tail-> next; q = q-> next; } struct ListNode * cur = list3; while ( cur && cur-> next) { if ( cur-> val == cur-> next-> val) { struct ListNode * temp = cur-> next; cur-> next = cur-> next-> next; free ( temp) ; } else { cur = cur-> next; } } return list3;
} void printList ( struct ListNode * head) { struct ListNode * cur = head; while ( cur != NULL ) { printf ( "%d " , cur-> val) ; cur = cur-> next; } printf ( "\n" ) ;
} int main ( ) { struct ListNode * list1 = createNode ( 1 ) ; list1-> next = createNode ( 2 ) ; list1-> next-> next = createNode ( 3 ) ; list1-> next-> next-> next = createNode ( 5 ) ; list1-> next-> next-> next-> next = createNode ( 7 ) ; struct ListNode * list2 = createNode ( 3 ) ; list2-> next = createNode ( 4 ) ; list2-> next-> next = createNode ( 5 ) ; list2-> next-> next-> next = createNode ( 6 ) ; list2-> next-> next-> next-> next = createNode ( 8 ) ; struct ListNode * list3 = mergeAndRemoveDuplicates ( list1, list2) ; printf ( "Merged and duplicates removed list: " ) ; printList ( list3) ; struct ListNode * temp; while ( list3) { temp = list3; list3 = list3-> next; free ( temp) ; } return 0 ;
}
2-8设双链表中的结点包括4个部分:前驱指针llink,后继指针rlink,数据域data,访问频度freq,初始时将各结点的freq设置为0。当对某结点访问时使该结点的freq增加1,并且将链表按照访问freq递减的顺序进行排序。请编写算法实现以上功能
# include <stdio.h>
# include <stdlib.h> struct DoubleListNode { int data; int freq; struct DoubleListNode * llink; struct DoubleListNode * rlink;
} ; struct DoubleListNode * createNode ( int data) { struct DoubleListNode * newNode = ( struct DoubleListNode * ) malloc ( sizeof ( struct DoubleListNode ) ) ; if ( newNode == NULL ) { printf ( "Memory allocation failed.\n" ) ; exit ( 1 ) ; } newNode-> data = data; newNode-> freq = 0 ; newNode-> llink = NULL ; newNode-> rlink = NULL ; return newNode;
} void insertNode ( struct DoubleListNode * * head, int data) { struct DoubleListNode * newNode = createNode ( data) ; if ( * head == NULL ) { * head = newNode; return ; } newNode-> rlink = * head; ( * head) -> llink = newNode; * head = newNode;
} void increaseFreq ( struct DoubleListNode * * head, int data) { if ( * head == NULL ) { return ; } struct DoubleListNode * cur = * head; while ( cur != NULL ) { if ( cur-> data == data) { cur-> freq++ ; struct DoubleListNode * prev = cur-> llink; while ( prev != NULL && prev-> freq < cur-> freq) { struct DoubleListNode * next = cur-> rlink; if ( prev-> llink) { prev-> llink-> rlink = cur; } cur-> llink = prev-> llink; cur-> rlink = prev; prev-> llink = cur; if ( next) { next-> llink = prev; } prev-> rlink = next; prev = cur-> llink; } break ; } cur = cur-> rlink; }
} void printList ( struct DoubleListNode * head) { struct DoubleListNode * cur = head; while ( cur != NULL ) { printf ( "(%d,%d) " , cur-> data, cur-> freq) ; cur = cur-> rlink; } printf ( "\n" ) ;
} void freeList ( struct DoubleListNode * head) { struct DoubleListNode * cur = head; while ( cur != NULL ) { struct DoubleListNode * temp = cur; cur = cur-> rlink; free ( temp) ; }
} int main ( ) { struct DoubleListNode * head = NULL ; insertNode ( & head, 3 ) ; insertNode ( & head, 5 ) ; insertNode ( & head, 2 ) ; insertNode ( & head, 8 ) ; printf ( "Original list: " ) ; printList ( head) ; increaseFreq ( & head, 2 ) ; increaseFreq ( & head, 5 ) ; increaseFreq ( & head, 3 ) ; printf ( "Updated list: " ) ; printList ( head) ; freeList ( head) ; return 0 ;
}