首页 > 代码库 > 单链表的小例子(二)增、删、查、改、排序

单链表的小例子(二)增、删、查、改、排序

#include<stdio.h>#include<stdlib.h>#include<string.h>//定义一个结构体存放数据typedef struct {     int num;    char name[20];}DATA;//定义链表typedef struct node{    DATA data;    struct node *next;}NODE,*PNODE;DATA getData();//模拟接受数据PNODE createNode(DATA data);//创建节点void freeAllNode(PNODE head);//释放节点void insertNode(PNODE head,DATA data);//顺序插入节点void showAllNode(PNODE head);//显示所有节点void deleteNode(PNODE head);//顺序删除节点PNODE findPreNode(PNODE head,int num);//查找节点void insert(PNODE head);//指定位置插入节点void _delete(PNODE head);//指定位置删除节点void edit(PNODE head);void editNode(PNODE p);//编辑节点void fun();char menu();void bubbleSort(PNODE head);//冒泡排序int Length(PNODE head);//链表长度int main(){        fun();    return 0;}void fun(){    PNODE head=createNode(getData());//创建空结点,带头节点的空表    int flag=1;        while(flag)    {                switch(menu())        {            case 1:insertNode(head,getData());break;            case 2:deleteNode(head);break;            case 3:insert(head);break;            case 4:delete(head);break;            case 5:edit(head);break;            case 6:showAllNode(head);break;            case 7:bubbleSort(head);break;            case 8:printf("\n\t节点数:%d个",Length(head));break;                            case q:flag=0;break;                }                printf("\t回车继续!\n");        getchar();            }    freeAllNode(head);    head=NULL;                }char menu(){    //system("clear");    printf("\n\t1)----插入节点\n");    printf("\n\t2)----删除节点\n");    printf("\n\t3)----选择插入节点\n");    printf("\n\t4)----选择删除节点\n");    printf("\n\t5)----编辑指定节点\n");    printf("\n\t6)----显示所有节点\n");    printf("\n\t7)----排序所有节点\n");    printf("\n\t8)----节点个数\n");    printf("\n\tq)----退出修改\n");    printf("\n\t请输入选项:");    char select =0;    select=getchar();    while((select!=\n)&&(getchar()!=\n));    return select;        }int Length(PNODE head){    int i=0;    while(head->next!=NULL)    {        head=head->next;        i++;    }    return i;}/*冒泡排序*/void bubbleSort(PNODE head){    /*--------------方法二--------*/    int i=0;    int num=Length(head);    PNODE p=head;    PNODE temp=NULL;    for(i=0;i<num;i++)    {        for(p=head;p->next->next!=NULL;p=p->next)        {            if(p->next->data.num > p->next->next->data.num)            {                temp=p->next;                p->next=temp->next;                temp->next=p->next->next;//temp-next=temp->next->next;                p->next->next=temp;//先断开后插入            }        }    }    /*--------------方法一---------*/    /*PNODE i=head->next;    PNODE j=head->next;    DATA temp;//struct DATA temp    for(i=head->next;i!=NULL;i=i->next)    {        for(j=head->next;j->next!=NULL;j=j->next)        {            if(j->data.num > j->next->data.num)            {                temp=j->data;                j->data=http://www.mamicode.com/j->next->data;>*/        }void editNode(PNODE p){    char select =0;    printf("\n\t1)----修改号码\n");    printf("\n\t2)----修改姓名\n");    printf("\n\tq)----退出修改\n");    printf("\n\t请输入选项:");        getchar();    select=getchar();        while((select!=\n)&&(getchar()!=\n));    switch(select)    {        case 1:printf("\t请输入新的号码:");            scanf("%d",&p->data.num);            break;        case 2:printf("\t请输入新的名字:");            scanf("%19s",p->data.name);            break;        case q:break;                default:printf("\t输入错误!\n");    }    }void edit(PNODE head){    int num=0;    printf("\n\t输入要编辑位置的数字:");    scanf("%d",&num);    head=findPreNode(head,num);    if(head==NULL)    {        printf("\n\t没找到%d数字\n",num);    }    else    {        //printf("\n\t将数字%d改为:",num);        //int num1=0;        //scanf("%d",&num1);        //getchar();        head=head->next;//->data.num=num1;        editNode(head);    }    }void _delete(PNODE head){    int num=0;    printf("\n\t输入要删除位置的数字:");    scanf("%d",&num);    head=findPreNode(head,num);    if(head==NULL)    {        printf("\n\t没找到%d数字\n",num);    }    else    {        deleteNode(head);    }    }/*----首先从外界接受一个整数num,查找这个节点。若找到,往这个节点插入一个节点;没找到,提示没找到!----*/void insert(PNODE head){    int num=0;    printf("\n\t输入要插入位置的数字:");    scanf("%d",&num);    head=findPreNode(head,num);    if(head==NULL)    {        printf("\n\t没找到%d数字\n",num);    }    else    {        insertNode(head,getData());    }        }PNODE findPreNode(PNODE head,int num){    /*-------查找等于num的数字(方法一)-----*/    PNODE p=head;    while(p->next!=NULL)    {        if(num==p->next->data.num)        {            //printf("\n\t找到了%d数字\n",num);            return p;        }        p=p->next;    }        return NULL;    /*-------查找第num个数(方法二)-----------*/        /*int i=0;    while((head->next!=NULL)&&i<num)    {        head=head->next;        i++;    }    if(i==num)    {        printf("\n\t找到了%d",num);        return head;    }        else    {    printf("\n\t没找到");        return NULL;    }*/}void showAllNode(PNODE head){    PNODE p=head->next;    printf("\tNum Name\n");    if(p==NULL)    {        printf("\n\t链表空!\n");        return;    }    while(p!=NULL)    {        printf("\t%d %s\n",p->data.num,p->data.name);        p=p->next;    }}void insertNode(PNODE head,DATA data){    PNODE temp=createNode(getData());    temp->next=head->next;    head->next=temp;}void deleteNode(PNODE head){     PNODE p=head->next;     head->next=p->next;    //同理:head->next=head->next->next;    free(p);}PNODE createNode(DATA data){    PNODE temp =(PNODE)malloc(sizeof(NODE));    temp->data=http://www.mamicode.com/data;    temp->next=NULL;    return temp;}DATA getData(){    static int n=0;    n++;    char str[20]={0};    sprintf(str,"test-%d",n);    DATA temp={n,""};    //temp.name[0]+=1;    strcpy(temp.name,str);    return temp;}void freeAllNode(PNODE head){    head=NULL;}

程序运行结果:

单链表的小例子(二)增、删、查、改、排序