指针与链表 指针与链表 链表的创建、插入、删除函数程序 #include<stdio.h> #define PT "学号:%1d 姓名:%-10s 成绩:%6.1f\n",p->num,p->name,p->score #define N sizeof(struct stud) struct stud { long num; char name[11]; long score; struct stud *next; }; ptint(struct stud * p) { p=p->next; while(p!=NULL) { printf(PT); p=p->next; } } ////////////////////////////////////////////////////////// /**************创建链表****************/ struct stud *creat(void) { struct stud *p1,*p2,*head; head=p2=(struct stud *)malloc(N); /*head,p2指向头节点*/ printf("请输入学号 姓名 成绩(学号输入0结束)\n"); p1=(struct stud *)malloc(N); /*p1指向第一个节点*/ scanf("%d %s %f",&p1->num,&p1->name,&p1->score); while(p1->num!=0) { p2->next=p1; /*将新节点连接到表尾*/ p2=p1; /*p2指向新的表尾*/ p1=(struct stud *)malloc(N); /*p1指向新申请的节点*/ scanf("%d %s %f",&p1->num,&p1->name,&p1->score); } p2->next=NULL; /*表尾节点next域置空*/ free(p1); /*释放无效节点*/ return head; } ///////////////////////////////////////////////////////// /****************链表节点插入********************/ int insert(struct stud *p0) { struct stud *p; p=(struct stud *)malloc(N); /*p指向新申请的节点*/ printf("请输入要插入的学号 姓名 成绩 \n"); scanf("%d %s %f",&p->num,&p->name,&p->score); while(p0->next != NULL && p0->next->num < p->num ) p0 = p0->next; /*继续查找插入位置*/ if(p0->next != NULL && p0->next->num == p->num) /*找到重号*/ { free(p); /*释放新节点的存储空间*/ return 0; /*不插入返回0*/ } p->next = p0->next; /*后继节点链接到新节点之后*/ p0->next = p; /*新节点链接到前驱节点之后*/ return 1; } ///////////////////////////////////////////////////////// /******************链表节点的删除*********************/ int delete(struct stud *p0) { long num; struct stud *p; p=p0->next; if(p == NULL) return 0; /*只有头结点为空表,不能删除返回0*/ printf("请输入要删除的学号 \n DNO:"); scanf("%d",&num); while(p != NULL) { if(p->num == num) /* 找到要删除的节点 */ { p0->next = p->next; /* 后续节点链接到前驱节点之后 */ free(p); return 1; } p0 = p; p = p->next; /* 推移指针继续查找 */ } return 0; /* 未找到要删除的节点返回0 */ } /////////////////////////////////////////////////////////////////// /****************************主函数*********************************/ void main() { struct stud *head,*p; head = creat(); print(head); p = find(head); if(p) ptintf(PT); else printf("没有找到!\n"); if(insert(head)) printf("已经成功插入 \n"); else print(head); if(delete(head)) ptintf("已经真确删除\n"); else printf("要删除的节点不存在 \n"); print(head); } |
|