zoukankan      html  css  js  c++  java
  • 链表操作,涉及到链表首节点指针变动的函数,即使形参包含首节点指针,必须返回首节点指针,原因不得而知

      1 //链表操作,涉及到链表首节点指针变动的函数,即使形参包含首节点指针,必须返回首节点指针,原因不得而知
      2 # include<stdio.h>
      3 # include<stdlib.h>
      4 struct Student
      5 {
      6     int num;
      7     struct Student* next;
      8 };
      9 struct Student* p;
     10 int main()
     11 {
     12     struct Student*p1;
     13     int n;
     14     scanf("%d",&n);
     15 
     16     int len(struct Student*);
     17     struct Student* create(int);                                /*这里不能用void create(struct Student*,int);
     18                                                                  因为创建链表涉及到链表首元素指针的变动,会出现错误,原因未解;*/
     19     
     20     struct Student* insert(struct Student*,struct Student*,int); /*不能用void insert(struct Student*,struct Student*,int);
     21                                                                  往链首插元素会涉及到链表首节点指针变动,从而引发错误*/
     22                                                                 
     23     
     24     struct Student* del(struct Student*,int);                    /*不能用void del(struct Student*,int);
     25                                                                  删除链首插元素会涉及到链表首节点指针变动,从而引发错误*/
     26     void print(struct Student*);
     27 
     28     p=create(n);
     29     print(p);
     30     p1=(struct Student*)malloc(sizeof(Student));
     31     p1->num=15;
     32 
     33     p=insert(p,p1,0);
     34     print(p);
     35     p=del(p,23);
     36     print(p);
     37 
     38     return 0;
     39 }
     40 
     41 int len(struct Student *p)
     42 {
     43     struct Student *p1=p;
     44     int i=0;
     45     while(p)
     46     {
     47         i++;
     48         p=p->next;
     49     }
     50     return i;
     51 }
     52 
     53 struct Student*  create(int n)   /*这里不能用void create(struct Student*,int);
     54                                  因为创建链表涉及到链表首元素指针的变动,会出现错误,原因未解;*/
     55 {
     56     int i=0;
     57     struct Student*p1,*p2,*head;
     58     p1=(struct Student*)malloc(sizeof(Student));
     59     while(i<n)
     60     {
     61         i++;
     62         p1->num=i;
     63         if(i==1) head=p2=p1;
     64         else
     65         {
     66             p2->next=p1;
     67             p2=p1;
     68         }
     69         p1=(struct Student*)malloc(sizeof(Student));
     70     }
     71     free(p1);
     72     p2->next=NULL;
     73     p1=NULL;
     74     return head;
     75 }
     76 
     77 struct Student* insert(struct Student* p,struct Student*p1,int n) /*不能用void insert(struct Student*,struct Student*,int);
     78                                                                  往链首插元素会涉及到链表首节点指针变动,从而引发错误*/
     79 {
     80     struct Student*q;
     81     q=p;
     82     int i=1,j=len(p);
     83     if(n<0||n>j)
     84     {
     85         printf("输入错误
    ");
     86     }
     87     else if(n==0)  //插到链头
     88     {
     89         p1->next=p;
     90         p=p1;
     91     }
     92     else
     93     {
     94         for(;i<n;i++,q=q->next);
     95         p1->next=q->next;
     96         q->next=p1;
     97         p1=NULL;
     98     }
     99     return p;
    100 }
    101 
    102 struct Student* del(struct Student* p,int n)  /*不能用void del(struct Student*,int);
    103                                                删除链首插元素会涉及到链表首节点指针变动,从而引发错误*/
    104 {
    105     struct Student*q,*r;
    106     int i,j=len(p);
    107     
    108     if(n<1||n>j)
    109     {
    110         printf("输入错误
    ");
    111     }
    112     
    113     else if(n==1)
    114     {
    115         q=p;
    116         p=p->next;
    117         free(q);
    118     }
    119     
    120     else
    121     {
    122         r=p;
    123         q=r->next;
    124         for(i=2;i<n;i++,q=q->next,r=r->next);
    125         r->next=q->next;
    126         free(q);
    127     }
    128     return p;
    129 }
    130 
    131 
    132 void print(struct Student* p)
    133 {
    134     int i=0;
    135     while(p!=NULL)
    136     {
    137         i++;
    138         printf("%5d",p->num);
    139         if(i%10==0) printf("
    ");
    140         p=p->next;
    141     }
    142     printf("
    ");
    143 
    144 }

    运行结果:

  • 相关阅读:
    JDBC连接MySQL并且查询操作。
    struts
    KMP 剪花布条hdoj2087
    线段树---敌兵布阵hdoj 1166
    设计模式----观察者模式
    线段树--hdoj1754
    ZOJ 2283 Challenge of Wisdom
    SGU 134 Centroid
    UVA 1637 Double Patience
    HDU 4389 X mod f(x)
  • 原文地址:https://www.cnblogs.com/bboykaku/p/12530875.html
Copyright © 2011-2022 走看看