![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <stdlib.h> 3 //第一关代码 4 typedef int DataType; 5 typedef struct node * PNode; 6 struct node 7 {//此处填写代码,定义链表结点类型,包含一个存放整型数据的 data 成员,和一个指向下一个结点的next成员 8 DataType data; 9 PNode next; 10 11 }; 12 typedef struct node * LinkList; 13 struct node *mycreateList() 14 {//此处填写代码,创建一个只有一个头结点的空链表,头节点的数据域赋值为0,并将表头结点的地址返回 15 LinkList list = (LinkList)malloc(sizeof(struct node)); 16 if(list!=NULL){ 17 list->data=0; 18 list->next=NULL; 19 return list; 20 } 21 } 22 23 24 //第二关代码 25 26 void myinsertHead(struct node * head, int insData ) 27 { 28 /*在此处完成任务,实现在head为表头d 链表的头插数据元素insData的功能*/ 29 //begin 30 PNode q= (PNode)malloc(sizeof(struct node)); 31 if(q!=NULL){ 32 q->data=insData; 33 //q->next=NULL; 34 q->next= head->next; 35 head->next=q; 36 37 } 38 39 //end 40 } 41 42 void myinsertTail(struct node * head , int insData ) 43 { 44 /*在此处完成任务,在head为表头的单链表表尾插入数据元素insData*/ 45 //begin 46 LinkList p = (LinkList)malloc(sizeof(struct node)); 47 p=head; 48 while(p->next!=NULL){ 49 p=p->next; 50 } 51 PNode q = (PNode)malloc(sizeof(struct node)); 52 if(q!=NULL){ 53 q->data=insData; 54 q->next=NULL; 55 p->next=q; 56 } 57 58 //end 59 } 60 61 void myprintList(struct node *L) 62 { 63 /*在此处完成任务,输出head为表头链表中的数据,每输出一个数据换一行*/ 64 //begin 65 LinkList p = (LinkList)malloc(sizeof(struct node)); 66 p=L->next; 67 while(p!=NULL){ 68 printf("%d ",p->data); 69 p=p->next; 70 } 71 72 //end 73 74 } 75 76 //第三关代码 77 void reverseList_link( struct node *L) 78 { 79 //请在此处填入代码,实现链表逆置功能 80 //begin 81 PNode pre=(PNode)malloc(sizeof(struct node)); 82 int i=0,num[1000]; 83 pre=L; 84 while(pre!=NULL){ 85 num[i++]=pre->data; 86 pre=pre->next; 87 } 88 pre=L; 89 //i=0; 90 while(pre!=NULL){ 91 pre->data=num[i--]; 92 //i++; 93 pre=pre->next; 94 } 95 /* 96 pre=L; 97 cur=L->next; 98 pre->next=NULL; 99 while(cur!=NULL){ 100 tmp=cur->next; 101 cur->next=pre; 102 pre=cur; 103 cur=tmp; 104 } 105 L=pre; 106 */ 107 /*PNode n = (PNode)malloc(sizeof(struct node)); 108 if(n!=NULL){ 109 n->next=NULL; 110 n->data=L->data; 111 } 112 113 114 p=q=L->next; 115 116 while(p->next!=NULL){ 117 p=p->next; 118 q->next=n; 119 n=q; 120 q=p; 121 } 122 L=p; 123 */ 124 //end 125 } 126 127 128 //第四关代码 129 int locateAndChange( struct node *L, int data) 130 { 131 //请在此处填入代码,在头结点为L的链表中查找 与data值相等的第一个结点,若能找到该结点,则将该结点的值与前驱结点的值交换 132 //若未找到与data值相等的结点,则返回值为-1,若找到的结点无前驱结点,则返回值为0,否则返回值为前驱结点的值 133 //begin 134 PNode p,q; 135 q=p=L; 136 while(p!=NULL){ 137 if(q!=p&&p->data==data){ 138 /* int tmp=q->data; 139 q->data=p->data; 140 p->data=tmp; 141 */ 142 return q->data; 143 } 144 if(q==p&&p->data==data){ 145 return 0; 146 } 147 q=p; 148 p=p->next; 149 } 150 return -1; 151 //end 152 } 153 154 //第五关代码 155 int destroyList(struct node *L) 156 { 157 //请在此处填写代码,实现将链表L的结点空间回收 158 //返回值为回收结点的个数,含头结点在内 159 PNode p , q ; 160 p=q= L; 161 int cnt=0; 162 while(p!=NULL){ 163 p=p->next; 164 free(q); 165 cnt++; 166 167 q=p; 168 } 169 return cnt; 170 }