删除:
算法思想
- 查找:通过计数方式找到第i-1个结点,并由指针p指向它(因为删除的是第i个结点)
- 删除第i个结点并释放结点空间
#include<stdio.h> #include<stdlib.h> #define len sizeof(Node) typedef struct Node { int data; struct Node *next; }Node,*LinkList; void InitList(LinkList *L) { *L=(LinkList)malloc(len); (*L)->next=NULL; } void CreateList(LinkList L) { Node* p; int a,flag=1; p=L; printf("Please enter datas:\n"); while(flag) { scanf("%d",&a); if(a!=0) { p=(LinkList)malloc(len); p->data=a; p->next=L->next; L->next=p; } else flag=0; } } void print(LinkList L) { Node *p; printf("you please data is:\n"); p=L; for(p=L->next;p!=NULL;p=p->next) { printf("%d\n",p->data); } } void Delist(LinkList L,int i,int *e) { Node *p,*r; int k; p=L; k=0; while(p->next!=NULL&&k<i-1)//找被删除的结点的前驱i-1使p指向它,正常跳出循环应是k=i-1 { p=p->next; k++; } if(p->next==NULL)//若是因为p->next==NULL跳出循环的,因为p->next为空,所以没有合法的前驱位置,说明i不合法 { printf("删除结点的位置i不合理!\n"); return; } r=p->next; p->next=r->next; *e=r->data; free(r); //删除的结点要释放存储空间 return; } void print_1(LinkList L) { Node *p; printf("you please data is:\n"); p=L; for(p=L->next;p!=NULL;p=p->next) { printf("%d\n",p->data); } } int main() { LinkList L; int *e,i; InitList(&L); CreateList(L); print(L); printf("please enter the node i you want delete:\n"); scanf("%d",&i); Delist(L,i,e); print_1(L); free(L) ; return 0; }
插入
算法思想
- 查找:在单链表中找到第-1个结点并由指针p指向它
- 申请:申请新的结点s,将其数据域置位e
- 插入挂链:通过修改指针域将新节点s挂入单链表L
代码实现:
#include<stdio.h> #include<stdlib.h> #define len sizeof(Node) typedef struct Node { int date; Node *next; }Node,*LinkList; void InitList(LinkList *L) { *L=(LinkList)malloc(len); (*L)->next=NULL; } void CreateList(LinkList L) { int b,flag=1; Node *r,*s; r=L; printf("please input datas and input 0 over:\n"); while(flag) { scanf("%d",&b); if(b!=0) { s=(LinkList)malloc(len); s->date=b; r->next=s; r=s; } else { flag=0; r->next=NULL; } } } void print(LinkList L) { Node* p=L; printf("you input datas is:\n"); for(p=L->next;p!=NULL;p=p->next) printf("%-2d\n",p->date); } void InsList(LinkList L,int i,int e) {//带头结点的单链表L中第i个位置插入值为e的新结点 Node *p,*s; int k; if(i<=0) { printf("插入失败!\n"); return ; } p=L; k=0; while(p!=NULL&&k<i-1)//从头开始找第i-1个结点 { p=p->next; k++; } if(p==NULL)//当p为空且还未找到i-1时,说明位置不合法 { printf("插入的位置不合理!\n"); return ; } s=(LinkList)malloc(sizeof(len)); s->date=e; s->next=p->next; p->next=s; printf("插入成功!\n"); return ; } void print_1(LinkList L) { Node* p=L; printf("you input datas is:\n"); for(p=L->next;p!=NULL;p=p->next) printf("%-2d\n",p->date); } int main() { LinkList L; int i,e; InitList(&L); CreateList(L); print(L); printf("在第i个位置插入数值为e的结点:\n"); printf("please enter i and e:\n"); scanf("%d%d",&i,&e); InsList(L,i,e); printf("插入后的新链表为:\n"); print_1(L); free(L) ; return 0; }
查找
1.按序号查找
算法思想
要查找带头结点的单链表中第i个结点,则需要从单链表的头指针L出发,从头结点L->nexrt顺着链域扫描,用指针p指向当前扫描的结点,j做计数器,累积当前扫描的结点数(初始值为0),j==ii时,指针p指向的就是要找到第i个结点
#include<stdio.h> #include<stdlib.h> #define len sizeof(Node) typedef struct Node { int date; Node *next; }Node,*LinkList; void InitList(LinkList *L) { *L=(LinkList)malloc(len); (*L)->next=NULL; } void CreateList(LinkList L) { int b,flag=1; Node *r,*s; r=L; printf("please input datas and input 0 over:\n"); while(flag) { scanf("%d",&b); if(b!=0) { s=(LinkList)malloc(len); s->date=b; r->next=s; r=s; } else { flag=0; r->next=NULL; } } } void print(LinkList L) { printf("you input datas is:\n"); Node* p=L; for(p=L->next;p!=NULL;p=p->next) printf("%-2d\n",p->date); } Node *Get(LinkList L,int i) { int j; Node *p; if(i<0) return NULL; p=L,j=0; //从头结点开始查找 ,头结点是第0个结点 while((p->next!=NULL)&&(j<i)) { p=p->next; j++; } if(i==j) return p; else return NULL; } int main() { int i; LinkList L,s; InitList(&L); CreateList(L); print(L); printf("please enter the node i want you find:\n"); scanf("%d",&i); s=Get(L,i); if(s!=NULL) printf("找到了第%d个结点,数值为%d\n",i,s->date); free(L) ; return 0; }
2.按值查找
算法思想
从单链表的头指针指向的结点出发,顺链将结点的值与给定的值e作比较,返回查找结果
#include<stdio.h> #include<stdlib.h> #define len sizeof(Node) typedef struct Node { int date; Node *next; }Node,*LinkList; void InitList(LinkList *L) { *L=(LinkList)malloc(len); (*L)->next=NULL; } void CreateList(LinkList L) { int b,flag=1; Node *r,*s; r=L; printf("please input datas and input 0 over:\n"); while(flag) { scanf("%d",&b); if(b!=0) { s=(LinkList)malloc(len); s->date=b; r->next=s; r=s; } else { flag=0; r->next=NULL; } } } void print(LinkList L) { Node* p=L; printf("you input datas is:\n"); for(p=L->next;p!=NULL;p=p->next) printf("%-2d\n",p->date); } Node *Locate(LinkList L,int key) { Node *p; p=L->next; while(p!=NULL) { if(p->date!=key) p=p->next; else break; } return p; } int main() { int key; LinkList L,s; InitList(&L); CreateList(L); print(L); printf("Enter the value you want to find:\n"); scanf("%d",&key); s=Locate(L,key); if(s!=NULL) printf("找到了!*^*\n") ; free(L) ; return 0; }
求单链表的长度
算法思想
从“头”开始“数”(p=L->next),用指针依次指向各个节点,并附设计数器j计数,一直“数”到最后一个结点(p->next==NULL),得到长度
#include<stdio.h> #include<stdlib.h> #define len sizeof(Node) typedef struct Node { int date; Node *next; }Node,*LinkList; void InitList(LinkList *L) { *L=(LinkList)malloc(len); (*L)->next=NULL; } void CreateList(LinkList L) { int b,flag=1; Node *r,*s; r=L; printf("please input datas and input 0 over:\n"); while(flag) { scanf("%d",&b); if(b!=0) { s=(LinkList)malloc(len); s->date=b; r->next=s; r=s; } else { flag=0; r->next=NULL; } } } void print(LinkList L) { printf("you input datas is:\n"); Node* p=L; for(p=L->next;p!=NULL;p=p->next) printf("%-2d\n",p->date); } Node *Get(LinkList L,int i) { int j; Node *p; if(i<0) return NULL; p=L,j=0; //从头结点开始查找 ,头结点是第0个结点 while((p->next!=NULL)&&(j<i)) { p=p->next; j++; } if(i==j) return p; else return NULL; } int Listlength(LinkList L) { int i=0;//保存链表的长度 Node *p; p=L->next; while(p!=NULL) { i++; p=p->next; } return i; } int main() { int length; LinkList L,s; InitList(&L); CreateList(L); print(L); length=Listlength(L); printf("Listlength is %d",length); free(L); return 0; }