赞
踩
一、单链表的结点插入
创建一个单链表结点的插入函数,将输入的学生的序号作为排序,按照从小到大的学号顺序插入学生信息
- struct student *insert(struct student *head,struct student *new) /*定义插入节点函数 */
- {
- struct student *p1,*p2,*pnew;
- p1 = p2 = head;
- pnew = new;
- if(head == NULL){
- head = pnew ;
- pnew->next = NULL;
- }
- else{
- while((pnew->number > p1->number) && (p1->next !=NULL)){
- p2 = p1; /* 不断移动指针 */
- p1 = p1->next;
- }
- if(pnew->number <= p1->number){ /*按照从小到大的学号排序 */
- if(p1 == head) /*判断插入位置是否是非空离链表的表头 */
- { pnew->next = p1; head = pnew; }
- else /*插入位置位于链表中间*/
- {p2->next = pnew; pnew->next = p1;}
- }else{ /*插入位置位于链表的尾部 */
- p1->next = pnew;
- pnew = NULL ;
- }
- }
-
- return (head);
- }
二、单链表的结点删除
(1)判断要删除的链表是否为空链表
(2)判断要删除的结点是位于链表的表头、中间还是表尾。
创建一个函数用于删除学生的信息,判断学号位于链表中的哪个位置,然后进行删除
- (struct student *)delete(struct student *head,int number) /* 删除链表结点的函数 */
- {
- struct student *p1,*p2;
- p1 = p2 = head;
-
- if(p1 == NULL){
- printf("the list is empty\n"); /*输入的链表为空链表 */
- }else
- {
- while((number != p1->number) && (p1->next != NULL)){
- p2 = p1;
- p1 = p1->next; /*不断移动指针,判断指向的结点是否为想要的结点 */
- }
-
- if((number == p1->number)) {
- if(p1 == head ){
- head = p1->next; /* 要删除的结点位于表头 */
- }else{
- p2->next = p1->next; /* 要删除的结点位于中间或者表尾 */
- }
- }else{
- printf("Don't have find the number\n"); /*没有找到要删除的结点 */
- }
- }
- return (head);
- }
综合实例:完成学生信息的写入,删除,排序,显示
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
-
-
- /*定义链表结构内容*/
- struct student
- {
- char name[10];
- long int number;
- struct student *next;
- };
-
- void putout(struct student *head);/*輸出链表中的内容*/
- struct student *delete(struct student *head); /* 删除链表结点的函数 */
- struct student *insert(struct student *head); /*定义插入节点函数 */
- int get_line(char *cmd);
-
-
- int main()
- {
- struct student *head;
- char buf[20];
- head = NULL;
-
- system("clear");
- while(1){
- // system("clear");
- printf("\n========================================\n\t\t学生信息功能表\n");
- printf(" [1]查看学生信息\n");
- printf(" [2]输入学生信息\n");
- printf(" [3]删除学生信息\n");
- printf("========================================\n\n");
-
- printf("请输入命令:");
- fflush(stdout);
- scanf("%s",buf) ;
- // get_line(buf);
- switch(buf[0]){
- case '1' :
- putout(head);break;
- case '2' :
- head = insert(head);break;
- case '3' :
- head = delete(head);break;
- default :
- printf("输入错误\n");break;
- }
- }
- return 0;
-
- }
-
-
- int get_line(char *cmd)
- {
- int i=0;
- char temp;
- memset(cmd,0,sizeof(cmd));
-
- while (1) {
- temp = getchar();
- cmd[i]=temp;
- if(cmd[i]==13 || cmd[i] == 10){
- cmd[i]=0;
- break;
- }
- fflush(stdout);
- i++;
- }
- return 0;
- }
-
- struct student *insert(struct student *head) /*定义插入节点函数 */
- {
- struct student *p1,*p2,*pnew;
- p1 = p2 = head;
-
- pnew = (struct student *)malloc(sizeof(struct student ));
- printf("请输入学生打姓名、学号,输入学号0则结束\n");
- scanf("%s%ld",pnew->name,&pnew->number);
- while(pnew->number >0){
- if(head == NULL){
- head = pnew ;
- pnew->next = NULL;
- }
- else{
- while((pnew->number > p1->number) && (p1->next !=NULL)){
- p2 = p1; /* 不断移动指针 */
- p1 = p1->next;
- }
-
- if(pnew->number <= p1->number){ /*按照从小到大的学号排序 */
- if(p1 == head) /*判断插入位置是否是非空离链表的表头 */
- { pnew->next = p1; head = pnew; }
- else /*插入位置位于链表中间*/
- { p2->next = pnew; pnew->next = p1;}
- }else{ /*插入位置位于链表的尾部 */
- p1->next = pnew;
- pnew = NULL ;
- }
- }
-
- pnew = (struct student *)malloc(sizeof(struct student ));
- printf("请输入学生打姓名、学号,输入学号0则结束\n");
- scanf("%s%ld",pnew->name,&pnew->number);
- p2 = p1 = head;
-
- }
- free(pnew);
- return (head);
- }
-
- struct student *delete(struct student *head) /* 删除链表结点的函数 */
- {
- struct student *p1,*p2;
- int number;
- p1 = p2 = head;
- printf("please input the student nember\n");
- scanf("%d",&number);
-
- if(p1 == NULL){
- printf("the list is empty\n"); /*输入的链表为空链表 */
- }else
- {
- while((number != p1->number) && (p1->next != NULL)){
- p2 = p1;
- p1 = p1->next; /*不断移动指针,判断指向的结点是否为想要的结点 */
- }
-
- if((number == p1->number)) {
- if(p1 == head ){
- head = p1->next; /* 要删除的结点位于表头 */
- }else{
- p2->next = p1->next; /* 要删除的结点位于中间或者表尾 */
- }
- }else{
- printf("Don't have find the number\n"); /*没有找到要删除的结点 */
- }
- }
-
- return (head);
- }
-
- /*輸出链表中的内容*/
- void putout(struct student *head)
- {
- if(head == NULL) printf("暂无学生信息\n");
- while(head!=NULL)
- {
- printf("name:%s\t number:%ld\n",head->name,head->number);
- head = head->next;
- }
-
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。