单链表基本操作
- 格式:doc
- 大小:187.50 KB
- 文档页数:11
一、系统功能图二、源代码/*本系统写于2013年10月27日广东工业大学西三743*注意实现了单链表的基本操作,包括建表,遍历,查询长度,插入,删除,排序*/#include<stdio.h>#include<malloc.h>#include<stdlib.h>//包含exit函数#include<conio.h>//包含清屏函数//定义结点typedef struct Node{int data;struct Node *next;}NODE,*PNODE;void show_list();//显示功能界面PNODE create_list();//创建void traverse_list(PNODE PHead);//遍历bool isempty_list(PNODE PHead);//判断空,功能函数,应该返回值int length_list(PNODE PHead);//链表长度,功能函数,应该返回一个整型void insert_list(PNODE PHead);//插入,应该有三个参数,头指针,插入位置,插入值,但为了让主函数简单,后两个放在函数体内void delete_list(PNODE PHead);//删除void sort_list(PNODE PHead);//排序//主函数int main(){PNODE PHead=NULL;char choice='0';show_list();printf("请建立链表,");PHead=create_list();//system("cls");//show_list();do{system("cls");show_list();printf("请选择你需要的操作");scanf("%c",&choice);switch(choice){case '1':printf("链表创建成功!");system("pause");break;case '2':traverse_list(PHead);break;case '3':sort_list(PHead);break;case'4':insert_list(PHead);break;case'5':delete_list(PHead);break;case '0':printf("感谢您的使用! \n");break;default:printf("输入非法,请重新输入\n");break;}}while(choice!='0');return 0;}//显示界面void show_list(){printf("***********************欢迎使用单链表演示系统***********************************");printf("********************************************************************************");printf("1.创建单链表\t 2.遍历链表\n");printf("3.排序链表\t 4.插入元素\n");printf("5.删除元素\t 0.退出\n");printf("********************************************************************* **********\n");}//创建链表PNODE create_list(){int n,i,a;PNODE head=(PNODE)malloc(sizeof(NODE));if(NULL==head){printf("内存分配失败,程序结束");exit(-1);}head->data=0;head->next=NULL;PNODE p,q;printf("输入结点数");scanf("%d",&n);if(n>0)//如果输入为0个结点则不用分配{for(i=0;i<n;i++){p=(PNODE )malloc(sizeof(NODE));if(NULL==p){printf("内存分配失败,程序结束");exit(-1);}printf("请输入第%d 个结点的值",i+1);scanf("%d",&a);p->data=a;if(NULL==head->next){head->next=p;//头结点也存放数据q=p;}else{q->next=p;q=p;}}q->next=NULL;}system("pause");return head;}//遍历链表void traverse_list(PNODE PHead) {PNODE p;p=PHead->next;if(false==isempty_list(PHead)){printf("链表为空\n");}while(p){printf("%d ",p->data);p=p->next;}printf("\n");system("pause");}//判断链表是否为空bool isempty_list(PNODE PHead) {if(!PHead->next){return false;}else{return true;}}//获取链表的长度int length_list(PNODE PHead){PNODE p;int len=0;p=PHead->next;//因为第一个结点不存数据while(p){len++;p=p->next;}return len;}//插入结点void insert_list(PNODE PHead){int i,val,post,len;PNODE pNew;//存放新结点PNODE p;//辅助结点,可以插入寻找位置p=PHead;printf("请输入插入位置");scanf("%d",&post);printf("请输入插入值");scanf("%d",&val);len=length_list(PHead);if(post<0||post>len+1)//因为不能插入末尾+1的位置{printf("输入位置有误");//如果有n 个结点,插入位置为m,则插入点在新链表中的位置为msystem("pause");return ;}else{pNew=(PNODE)malloc(sizeof(NODE));if(NULL==pNew){printf("内存分配失败,程序结束");exit(-1);}pNew->data=val;pNew->next=NULL;//如果插入最后一个位置时要把尾指针置空for(i=0;i<post-1;i++)//寻找插入位置{p=p->next;}pNew->next=p->next;//存放插入位置后一个结点指针p->next=pNew;}traverse_list(PHead);//测试插入效果}//删除结点void delete_list(PNODE PHead){int i,val,post,len;//val 存放删除的数据PNODE p,pFree;p=PHead;printf("请输入要删除的位置");scanf("%d",&post);len=length_list(PHead);if(post<0||post>len){printf("删除位置非法,删除失败");system("pause");return;}else{for(i=0;i<post-1;i++)//寻找删除位置{p=p->next;}}pFree=p->next;//要删除的结点,便于释放内存val=pFree->data;p->next=p->next->next;free(pFree);printf("删除成功,删除的是第%d 个结点,删除值为%d\n",post,val);system("pause");}//排序void sort_list(PNODE PHead){int i,j,len,t;//模仿数组的排序,本次使用冒泡法PNODE p,q;//p=PHead->next ;//因为第一个头结点不存放数据//q=p->next;//q为第二个结点len=length_list(PHead);for(i=0,p=PHead->next;i<len-1;i++,p=p->next)//n个结点只需要比较n-1次即可,注意结点也要向后移动{for(j=i+1,q=p->next;j<len;j++,q=q->next)//第一个分号语句不能写在前面,因为每轮比较后q的指针都已经移动了链表末尾{if(p->data >q->data){t=p->data;p->data=q->data;q->data=t;}}}printf("排序成功! \n");traverse_list(PHead);}三、运行与调试1.创建单链表2.遍历链表3.排序4.插入元素插入位置有误:5.删除元素6.退出。