数据结构之单链表
1建立只有头结点的空表
2判断链表是否为空,返回1为空,0非空
3单链表的创建,头插法
4单链表的创建,尾插法
5顺序打印出单链表的数据
6取得链表中第loc个元素,返回取得的元素
7在第loc个元素前插入a,返回值1代表插入成功,0代表插入失败
8删除第loc个元素,返回值表示删除的值
9//返回单链表的长度
10判断单链表是否有环,返回值为环的长度
11求出环的开始位置,返回开始位置的数据域
12单链表的逆转
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Node { int data; struct Node *next; }linklist; //linklist *head; //建立只有头结点的空表 linklist *listinit() { linklist *list; list=(linklist *)malloc(sizeof(linklist)); if(list==NULL) exit(0); list->next=NULL; return list; } //判断链表是否为空,返回1为空,0非空 int listisempty(linklist *list) { if(!list->next) { return 1; } else { return 0; } } //单链表的创建,头插法 linklist *listcreatehead(linklist *head,int n) { linklist *p=NULL; int i=0,a=0; head=(linklist *)malloc(sizeof(linklist)); head->next=NULL; for(i=0;i<n;i++) { p=(linklist*)malloc(sizeof(linklist)); scanf("%d",&a); p->data=a; p->next=head->next; head->next=p; } return head; } //单链表的创建,尾插法 linklist *listcreatetail(linklist *head,int n) { linklist *p=NULL,*r=NULL; int i=0,a=0; head=(linklist *)malloc(sizeof(linklist)); r=(linklist *)malloc(sizeof(linklist)); head->next=NULL; r=head; for(i=0;i<n;i++) { p=(linklist*)malloc(sizeof(linklist)); scanf("%d",&a); p->data=a; r->next=p; r=p; } r->next=NULL; return head; } //顺序打印出单链表的数据 void listdisplay(linklist *list) { linklist *p; p=(linklist*)malloc(sizeof(linklist)); if(list->next==NULL) printf("单链表为空\n"); p=list->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } //取得链表中第loc个元素,返回取得的元素 int listgetelem(linklist *list,int loc) { int i=1; linklist *r; r=(linklist *)malloc(sizeof(linklist)); r=list->next; while(i<loc&&r!=NULL) { i++; r=r->next; } if(!r||i<loc) { printf("参数不正确\n"); return 0; } return r->data; } //在第loc个元素前插入a,返回值1代表插入成功,0代表插入失败 linklist *listinsert(linklist *list,int loc,int a) { int i=1; linklist *r,*s; r=(linklist *)malloc(sizeof(linklist)); s=(linklist *)malloc(sizeof(linklist)); r=list->next; while(i<loc-1&&r!=NULL) { i++; r=r->next; } if(!r->next||i<loc-1) { printf("插入位置不正确\n"); exit(0); } s->data=a; s->next=r->next; r->next=s; return s; } //删除第loc个元素,返回值表示删除的值 int listdelete(linklist *list,int loc) { int i=1; linklist *r=NULL,*s=NULL; r=(linklist *)malloc(sizeof(linklist)); s=(linklist *)malloc(sizeof(linklist)); r=list->next; while(i<loc-1&&r!=NULL)//定位到前一个元素 { i++; r=r->next; } if(!r->next||i<loc-1) { printf("参数不正确\n"); return 0; } s=r->next; r->next=s->next; free(s); return 1; } //返回单链表的长度 int listlength(linklist *list) { int length=0; linklist *r; r=(linklist *)malloc(sizeof(linklist)); r=list->next; while(r!=NULL) { length++; r=r->next; } return length; } //判断单链表是否有环,返回值为环的长度 int listcircle(linklist *list) { int circlelen=1; linklist *fast=NULL,*slow=NULL,*p; fast=(linklist *)malloc(sizeof(linklist)); slow=(linklist *)malloc(sizeof(linklist)); p=(linklist *)malloc(sizeof(linklist)); fast=list; slow=list; for(;fast!=NULL&&fast->next!=NULL;) { fast=fast->next->next; slow=slow->next; if(fast==slow) { p=slow->next; for(;p!=slow;) { circlelen++; p=p->next; } return circlelen; } } return 0; } //求出环的开始位置,返回开始位置的数据域 int listcirclestart(linklist *list) { int i=0; int circlelen=listcircle(list); linklist *p,*q; p=(linklist *)malloc(sizeof(linklist)); q=(linklist *)malloc(sizeof(linklist)); p=list->next; for(;p!=NULL;) { q=p; for(i=0;i<circlelen;i++) { q=q->next; } if(q==p) { return q->data; } p=p->next; } return 0; } //单链表的逆转 void listreverse(linklist *list) { linklist *p,*q; p=(linklist *)malloc(sizeof(linklist)); q=(linklist *)malloc(sizeof(linklist)); p=list->next; q=p->next; p->next=NULL; while(q) { p=q; q=q->next; p->next=list->next; list->next=p; } } //测试 void main() { linklist *head1=NULL,*insertp=NULL,*list=NULL; insertp=(linklist *)malloc(sizeof(linklist)); list=(linklist *)malloc(sizeof(linklist)); head1=listcreatetail(head1,4); printf("head1 is empty:%d\n",listisempty(head1)); printf("head1:"); listdisplay(head1); printf("length of head1 :%d\n",listlength(head1)); insertp=listinsert(head1,2,100); listdisplay(head1); printf("head1第几个元素:%d\n",listgetelem(head1,5)); listdelete(head1,3); printf("after delete :"); listdisplay(head1); printf("head1 reverse:"); listreverse(head1); listdisplay(head1); printf("是否有环(环的长度):%d\n",listcircle(head1)); //构造环 list=head1->next; while(list->next!=NULL) { list=list->next; } list->next=insertp; printf("是否有环(环的长度):%d\n",listcircle(head1)); printf("环的开始元素为:%d\n",listcirclestart(head1)); }