首页 > 代码库 > 单链表的小例子(二)增、删、查、改、排序
单链表的小例子(二)增、删、查、改、排序
#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;}
程序运行结果:
单链表的小例子(二)增、删、查、改、排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。