1.链表的初始化
struct link{ int data; struct link*next; }
struct link* head;//定义头指针变量 head=(struct link*)malloc(sizeof(struct link));//头指针指向分配的头节点内存空间 head->next=NULL;//头节点指针域为空
2.尾插法建立链表
struct link *r,*s; int data; r=head;//r指向头节点 while(1) { scanf("%d",&data); if(data==0) break; s=(struct link*)malloc(sizeof(sturct link));//为节点分配内存空间 s->data=data; r->next=s;//原来的节点指向新节点 r=s;//记录r的指向,r指向新节点 } r->next=NULL;//尾节点指针为空
3.头插法建立链表
struct link *s; int data; while(1) { scanf("%d",&data); if(data==0) break; s=(struct link*)malloc(sizeof(sturct link));//为节点分配内存空间 s->data=data; s->next=head->next;//让新节点指向head所指的下一个节点 head->next=s;//头节点指向新节点 }
3.输出单向链表
struct link*p; p=head->next;//指向首元节点 while(p) { printf("%d",p->data); p=p->next;//移动指针遍历每个节点 }
4.链表的逆置
struct link*p,*q; p=head->next;//p指向首元节点 head->next=NULL;//将原链表变为空表,同时也保证了逆置后的链表,为节点指针域为NULL while(p) { q=p->next; p->next=head->next;//保存上一个元素的地址,找到下一个链表元素,例如让第1个节点指向NULL,例如让第2个节点指向第1个节点等等 head->next=p;//让head始终指向更靠后的链表元素,例如循环一次后head指向第1个节点,接着循环head指向第2个节点,由于有上一行代码,第2个节点同时指向第1个节点,使整个链表能连接起来 p=q;//改变p的指向,p=NULL时,结束循环,完成逆置。 }
5.单链表的插入
struct link*p=head,*s; int j=0; while(p&&j<i-1)//找到要插入节点前的那个节点,找到第(i-1)个节点的地址 { p=p->next; j++; } if(p) { s=(struct link*)malloc(sizeof(struct link));//动态内存申请 scanf("%d",&s->data); s->next=p->next;//新节点指向原来的第i个节点 p->next=s;//新节点成为新链表的第i个节点 }
6.单项链表元素的删除
struct link*p=head,*s; int j=0; while(j<y-1&&p)//找到要插入节点前的那个节点,找到第(x-1)个节点的地址 { p=p->next; j++; } if(p==NULL||p->next==NULL) printf("该节点不存在\n"); else { s=p->next;//s指向第x个节点 p->next=s->next;//链接删除节点两边的节点 free(s);//释放要删除节点的内存空间 }
7.链表的删除(释放所有节点占用的内存)
struct link*p=head,*pr=NULL; while(p) { p=pr;//在pr中保存当前指针 p=p->next; free(pr); }
8.单链表的查询
struct link *p=head->next; while(p) { if(p->data!=z)//z为要查找的数据 p=p->next; else break;//找到 if(p=NULL) { printf("Nothing");//没找到 } return p; }
9.链表的长度
struct link* p=head->next; int count=0; while(p) { p=p->next; count++; } return count;