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 ;
}