链表的创建、插入、删除、释入

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 struct chain
  5 {
  6     int num;
  7     float score;
  8     struct chain *next;
  9 };
 10 
 11 //创建新链表
 12 struct chain *create()
 13 {
 14     struct chain *head;
 15     //申请新节点空间
 16     head = (struct chain *)malloc(sizeof(struct chain));
 17     if(head == NULL)
 18     {
 19         printf("申请节点失败\n");
 20         return NULL;
 21     }
 22     return head;
 23 }
 24 
 25 //加入新的节点
 26 struct chain *insert(struct chain *head,struct chain *s)
 27 {
 28     struct chain *p=head;
 29     //如果链表循环并且新节点的分数大于下一个节点的分数
 30     while((p->next != NULL) && (s->score > p->next->score))
 31     {
 32         p=p->next;
 33     }
 34     //如果链表循环到结尾
 35     if(p->next == NULL)
 36     {
 37         p->next = s;
 38         s->next = NULL;
 39     }
 40     //如果新的节点的分数大于下一个节点的分数
 41     else
 42     {
 43         p->next = s;
 44         s->next = p->next;
 45     }
 46     return head;
 47 }
 48 
 49 //查找符号条件的节点
 50 struct chain *search(struct chain *head)
 51 {
 52     int num;
 53     struct chain *p = head;
 54     printf("请输入要查找的学生的学号:\n");
 55     scanf("%d",&num);
 56 
 57     //链表循环并且链表中的学号不等于要查找的学号
 58     while((p->next != NULL) && (p->num != num))
 59     {
 60         p=p->next;
 61     }
 62 
 63     //链表循环到结尾 
 64     if(p->next == NULL)
 65     {
 66         printf("查找学号失败,没有这个学号\n");
 67         return NULL;
 68     }
 69     //链表中的学号等于要查找的学号
 70     else
 71     {
 72         printf("找到符号条件的学号num=%d\t%f",p->num,p->score);
 73         return p;
 74     }
 75 }
 76 
 77 //对链表进遍历输出
 78 void printf_list(struct chain *head)
 79 {
 80     struct chain *p = head;
 81     printf("链表如下:\n");
 82 
 83     while(p->next != NULL)
 84     {
 85         printf("学生的学号%d,成绩%f",p->num,p->score);
 86         p=p->next;
 87     }
 88 }
 89 
 90 //释放链表
 91 void free_list(struct chain *head)
 92 {
 93     struct chain *p = head;
 94 
 95     while(p->next != NULL)
 96     {
 97         head = head->next;
 98         free(p);
 99         p=head;
100     }
101     printf("释入链表成功\n");
102 }
103 
104 //删除链表符合条件的节点
105 struct chain *delete_list(struct chain *head,int num)
106 {
107     struct chain *p = head;
108     struct chain *q = head->next;
109 
110     while((q != NULL) && (q->num != num))
111     {
112         p=q;
113         q=q->next;
114     }
115 
116     if(q == NULL)
117     {
118         printf("删除失败,没有找到符合条件的节点\n");
119         return NULL;
120     }
121     else
122     {
123         p->next = q->next;
124         free(q);
125         printf("删除节点成功\n");
126     }
127     return head;
128 }
129 
130 int main()
131 {
132     struct chain *p,*head;
133     int num;
134     int c;
135     float score;
136     printf("有头节点的链表操作程序:\n");
137     head = create();
138     
139     while(1)
140     {
141         printf("I:插入节点(自动升序) P:输出链表 S:查找节点 D:删除节点\
142                E:释入链表并退出程序\n");
143         c = getchar();
144         switch(c)
145         {
146             case'I':
147             printf("请分别输入要插入学生的学号和成绩\n");
148             scanf("%d%f",&num,&score);
149             p = (struct chain *)malloc(sizeof(struct chain));
150             if(p == NULL)
151             {
152                 printf("申请节点失败\n");
153                 exit(0);
154             }
155             p->num = num;
156             p->score = score;
157             insert(head,p);
158             printf("插入成功\n");
159             break;
160             case'P':
161             printf_list(head);
162             break;
163             case'S':
164             search(head);
165             break;
166             case'D':
167             printf("请输入要删除学生的学生号:\n");
168             scanf("%d",&num);
169             delete_list(head,num);
170             break;
171             case'E':
172             free_list(head);
173             exit(0);
174         }
175     }
176     return 0;
177 }

 

posted @ 2016-02-29 11:47  启云  阅读(289)  评论(0编辑  收藏  举报