标签:
单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结点的空间,删除一个结点也可以释放(free()),跟顺序表一样的,首先先来定义一个单链表,
1 typedef struct lnode 2 { 3 int data; 4 struct lnode *next; 5 }LNode,*LinkList;
typedef是将类型struct lnode改为LNode,还有指向这个类型的指针*LinkList;,所以当我们创建的每个这样的类型都包含左数据,有指针,创建完单链表,这个表还是空的;先构建单链表并输入数据(逆序输入(表头插入)):
LinkList creatN() { LinkList L,s; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; int x; scanf("%d",&x); while(x!=-1) { s=(LinkList)malloc(sizeof(LNode)); s->data=x; s->next=L->next; L->next=s; scanf("%d",&x); } return L; }
正序插入(表尾插入):
LinkList creatZ() { LinkList L,s; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; LinkList p; p=L; int y; scanf("%d",&y); while(y!=-1) { s=(LinkList)malloc(sizeof(LNode)); s->data=y; s->next=NULL; p->next=s; p=p->next; scanf("%d",&y); } return L; }
输出函数:
int print(LinkList L) { LinkList p=L->next; while(p!=NULL) { printf("|%d|",p->data); p=p->next; } printf("\n"); printf("请继续使用,请输入0~8的数字:\n"); }
接下来弄一个表格把所有函数都实现:,
#include "stdio.h" typedef struct lnode { int data; struct lnode *next; }LNode,*LinkList;/* */ LinkList creatN(); LinkList creatZ(); void ShowMainWindow(); int print(LinkList L); int addbiaowei(LinkList L,int x); int addbiaotou(LinkList L,int x); int deletbiaowei(LinkList L); int deletbiaotou(LinkList L); int findmax(LinkList L); int findreplace(LinkList L,int i,int x); main() { printf("正序插入请按扣z(否则为逆序插入):"); LinkList L; char a; scanf("%c",&a); if(a==‘z‘) { printf("请输入数据并以-1为结尾:\n"); L=creatZ(); } else { printf("请输入数据并以-1为结尾:\n"); L=creatN(); } system("cls"); ShowMainWindow(); printf("请输入0~8的数字:\n"); while(1) { int num; scanf("%d",&num); if(num==1) { printf("%请输入你想要在表尾增加的数据:\n"); int y; scanf("%d",&y); addbiaowei(L,y); } else if(num==2) { printf("请输入你想要在表头增加的数据:\n"); int y; scanf("%d",&y); addbiaotou(L,y); } else if(num==3) { deletbiaowei(L); } else if(num==4) { deletbiaotou(L); } else if(num==5) { int max; max=findmax(L); printf("最大值为:%d\n请继续使用,请输入0~8的数字:\n",max); } else if(num==6) { printf("请输入你要查找的元素,并且返回元素所在的位置!:"); int x; scanf("%d",&x); LinkList p=L->next->next; int j=1; while(p->next!=NULL) { if(p->data==x) printf("此元素在%d个位置\n",j); j++; p=p->next; } printf("请输入0~8的数字:\n"); } else if(num==7) { printf("请输入你要的替换的位置和元素!:\n"); int i,x; scanf("%d,%d",&i,&x); findreplace(L,i,x); } else if(num==8) { printf("此表的数据为:"); print(L); } else if(num==0) break; } printf("%d",L->next->data); } void ShowMainWindow() { printf("\n\n\t+-----------------------------------------------------+\n"); printf("\t| 单链表练习 |\n"); printf("\t+-----------------------------------------------------+\n"); printf("\t|------------------- 1.表尾增加-----------------------|\n"); printf("\t|------------------- 2.表头增加-----------------------|\n"); printf("\t|------------------- 3.表尾删除-----------------------|\n"); printf("\t|------------------- 4.表头删除-----------------------|\n"); printf("\t|------------------- 5.查找最大值---------------------|\n"); printf("\t|------------------- 6.查找元素的位置-----------------|\n"); printf("\t|------------------- 7.替换元素-----------------------|\n"); printf("\t|------------------- 8.打印表-------------------------|\n"); printf("\t|------------------- 0.退出系统-----------------------|\n"); printf("\t+-----------------------------------------------------+\n"); printf("\t| 请输入您的选择(0-5) |\n"); printf("\t+-----------------------------------------------------+\n"); printf("\n\n"); } LinkList creatN() { LinkList L,s; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; int x; scanf("%d",&x); while(x!=-1) { s=(LinkList)malloc(sizeof(LNode)); s->data=x; s->next=L->next; L->next=s; scanf("%d",&x); } return L; } LinkList creatZ() { LinkList L,s; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; LinkList p; p=L; int y; scanf("%d",&y); while(y!=-1) { s=(LinkList)malloc(sizeof(LNode)); s->data=y; s->next=NULL; p->next=s; p=p->next; scanf("%d",&y); } return L; } int addbiaowei(LinkList L,int x) { LinkList p=L; LinkList s; while(p->next!=NULL) { p=p->next; } s=(LinkList)malloc(sizeof(LNode)); s->data=x; p->next=s; s->next=NULL; printf("在表尾添加成功,查看请按8!\n"); } int addbiaotou(LinkList L,int x) { LinkList s; s=(LinkList)malloc(sizeof(LNode)); s->data=x; s->next=L->next; L->next=s; printf("在表头添加成功,查看请按8!\n"); } int deletbiaowei(LinkList L) { LinkList p=L; LinkList s; while(p->next->next!=NULL) { p=p->next; } p->next=NULL; free(p->next); printf("表尾删除成功,查看请按8!\n"); } int deletbiaotou(LinkList L) { LinkList p=L->next; L->next=p->next; p->next=NULL; free(p->next); printf("表头删除成功,查看请按8!\n"); } int findmax(LinkList L) { int max; LinkList p=L->next; max=p->data; while(p->next!=NULL) { p=p->next; if(max<p->data) max=p->data; } return max; } int print(LinkList L) { LinkList p=L->next; while(p!=NULL) { printf("|%d|",p->data); p=p->next; } printf("\n"); printf("请继续使用,请输入0~8的数字:\n"); } int findreplace(LinkList L,int i,int x) { LinkList p=L->next; int j=0; while(p->next!=NULL&&j<i-1) { j++; p=p->next; } p->data=x; printf("替换成功,查看请按8!:\n"); }
这就是一个完整的单链表,函数功能可以自己复制运行试一试。
标签:
原文地址:http://www.cnblogs.com/doudoublog/p/5342344.html