链式线性表——课上练

  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 }
View Code
原文地址:https://www.cnblogs.com/jeseesmith/p/13825907.html