C语言链表(十七)

来源:互联网 发布:大数据时代质量管理 编辑:程序博客网 时间:2024/05/23 20:28


转自:http://blog.163.com/xujian900308@126/blog/static/1269076152011917101420316/

#include <stdio.h>#include <stdlib.h>struct grade {    int score;    struct grade *next;} *head, *pnew;typedef struct grade NODE;//创建链表struct grade *create();//插入链表void insert(NODE *head,NODE *pnew,int i);//删除列表void pdelete(NODE *head, int i);//输出链表void display(NODE *head);//销毁链表void Pfree(NODE *head);int main(int argc, const char * argv[]){    head = create();    if (head==NULL)    {        return 0;    }        puts("输出创建的链表");    display(head);        pnew = (NODE*)malloc(sizeof(NODE));    if (pnew==NULL)    {        puts("创建失败");        return 0;    }    display(pnew);        //将新节点插入节点3的后面    pnew->score = 33;    insert(head, pnew, 3);    puts("插入后的链表");    display(head);        //删除节点3    pdelete(head, 3);    puts("删除后的链表: ");    display(head);            /*     输出:          输入学生成绩     100     90     80     70     30     -10          输出创建的链表     100 90 80 70 30          插入后的链表     100 90 80 33 70 30           删除后的链表:      100 90 33 70 30          */            return 0;}struct grade *create(){    NODE *head, *tail, *pnew;    int score;        //创建头节点    head = (NODE*)malloc(sizeof(NODE));    if (head==NULL)    {        puts("创建失败");        return NULL;    }        //头节点指针域置NULL    head->next = NULL;    //开始时尾指针指向头节点    tail = head;        puts("输入学生成绩");    //创建链表    while (1)    {        scanf("%d",&score);        //成绩为负退出循环        if (score<0)        {            break;        }                //创建新节点        pnew = (NODE*)malloc(sizeof(NODE));        if (pnew==NULL)        {            return NULL;        }        pnew->score = score;        //新节点指针域置空        pnew->next = NULL;        //新节点插入到表尾        tail->next = pnew;        //为指针指向当前的尾节点        tail = pnew;    }            return head;}//插入链表void insert(NODE *head,NODE *pnew,int i){    NODE *p;    int j;        p=head;    for(j=0;j<i&&p!=NULL;j++)  //p指向要插入的第i个节点        p=p->next;    if(p==NULL)  //节点i不存在    {        printf("与插入的节点不存在!");        return;    }        pnew->next=p->next;   //插入节点的指针域指向第i个节点的后继节点    p->next=pnew;    //犟第i个节点的指针域指向插入的新节点}//删除列表void pdelete(NODE *head, int i){    NODE *p,*q;    int j;    if(i==0)  //删除的是头指针,返回        return;    p=head;    for(j=1;j<i&&p->next!=NULL;j++)        p=p->next;  //将p指向要删除的第i个节点的前驱节点    if(p->next==NULL)  //表明链表中的节点不存在    {        printf("不存在!");        return;    }    q=p->next;  //q指向待删除的节点    p->next=q->next;  //删除节点i,也可写成p->next=p->next->next    free(q);   //释放节点i的内存单元}//输出链表void display(NODE *head){    NODE *p;    for(p=head->next;p!=NULL;p=p->next)    {        printf("%d ",p->score);    }        printf("\n");}//销毁链表void Pfree(NODE *head){    NODE *p,*q;        p=head;    while(p->next!=NULL)    //每次删除头节点的后继节点    {        q=p->next;        p->next=q->next;        free(q);    }    free (head);  //最后删除头节点}


0 0
原创粉丝点击