码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-10-09 00:40:37      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   ar   for   数据   sp   

#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=j->next->data;
                j->next->data=temp;
            }
        }
        
    }*/    
    
}
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=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;
}

程序运行结果:

bubuko.com,布布扣

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

标签:style   blog   http   color   io   ar   for   数据   sp   

原文地址:http://www.cnblogs.com/xinglei/p/4012013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!