题目:
输入无序的元素,分别建立两个有3个结点的有序单链表(有头结点)(显示排序后的链表),交换两个单链表的第二个结点(注意不能采取直接赋值法的方式,要进行结点的移动),最后显示链表中的元素。
1 #include <stdio.h> 2 #define ElemType int 3 4 //定义结构 5 typedef struct Node 6 { 7 ElemType data; 8 struct Node * next; 9 }Node, *LinkList; 10 11 //初始化 12 void InitList(LinkList *L) 13 { 14 *L = (LinkList)malloc(sizeof(Node)); 15 (*L)->next = NULL; 16 } 17 18 //尾插法创建 19 void CreatFromTail(Node *L) 20 { 21 Node *r, *s; 22 ElemType c; 23 int flag = 1; 24 r = L; 25 while(flag) 26 { 27 scanf("%d", &c); 28 if(c != 0) 29 { 30 s = (LinkList)malloc(sizeof(Node)); 31 s->data = c; 32 r->next = s; 33 r = s; 34 } 35 else 36 { 37 flag = 0; 38 r->next = NULL; 39 } 40 } 41 } 42 43 //打印链表 44 void print(Node *L) 45 { 46 Node *t, *p = L; 47 t = p->next; //t是头结点 48 while(t != NULL) 49 { 50 printf("%d ", t->data); 51 t = t->next; 52 } 53 } 54 55 //实现交换 56 void swap(Node *L1, Node *L2) 57 { 58 Node *p1 = L1, *p2 = L2; 59 60 p1 = L1->next->next; 61 p2 = L2->next->next; 62 63 64 L1->next->next = p2; //L1->next 指向第一个节点, L1->next->next 指向第二个节点 65 L2->next->next = p1; 66 67 p1 = L1->next->next->next; 68 p2 = L2->next->next->next; 69 70 L1->next->next->next = p2; //L1->next 指向第一个节点, L1->next->next 指向第二个节点, L1->next->next->next 指向第三个节点 71 L2->next->next->next = p1; 72 73 74 } 75 // 76 int main(int argc, char const *argv[]) 77 { 78 Node *p1 = NULL; 79 Node *p2 = NULL; 80 InitList(&p1); 81 InitList(&p2); 82 CreatFromTail(p1); 83 CreatFromTail(p2); 84 // print(p1); 85 // print(p2); 86 swap(p1, p2); 87 print(p1); 88 print(p2); 89 return 0; 90 }