单向链表的操作
2016-10-31 18:47
260 查看
上一篇博客解决了链表的建立和打印的问题,现在来解决单向链表里的其他操作
包括求表长、按值查找、按序查找、添加、删除等,都在下面的C语言程序里给出
至此完成单向链表的操作
包括求表长、按值查找、按序查找、添加、删除等,都在下面的C语言程序里给出
#include <stdio.h> #include <stdlib.h> typedef struct Node *PtrToNode; struct Node { int Data; PtrToNode Next; }; PtrToNode Read(); void Print( PtrToNode L ); int length(PtrToNode ptrl); PtrToNode findkth(int k ,PtrToNode ptrl); //按值查找 PtrToNode find(int X,PtrToNode ptrl); //插入操作 PtrToNode insert(int X,int i,PtrToNode ptrl); PtrToNode del(int i,PtrToNode ptrl); int main() { PtrToNode L1; L1 = Read(); Print(L1); int len=length(L1); printf("%d\n",len); PtrToNode L2=insert(3,3,L1); Print(L2); PtrToNode L3=del(3,L2); Print(L3); PtrToNode L4=insert(3,7,L3); Print(L4); PtrToNode L5=del(7,L3); Print(L5); return 0; } PtrToNode Read() { int num = 0; PtrToNode h = NULL; PtrToNode last = NULL; scanf( "%d",&num ); if(num<=0) return NULL; else{ h = ( PtrToNode )malloc( sizeof( struct Node ) );//建立头结点 h->Data=num; h->Next = NULL; last = h; scanf( "%d",&num ); while(num>0){ PtrToNode node = ( PtrToNode )malloc( sizeof( struct Node ) ); node->Data = num; node->Next = NULL; last->Next = node; last = node; scanf( "%d",&num ); } return h; } } void Print( PtrToNode L ) { if(L==NULL){ printf("NULL\n"); return; } while(L!=NULL){ printf("%d ",L->Data); L=L->Next; } putchar('\n'); } //求表长 int length(PtrToNode ptrl){ PtrToNode p=ptrl; int j=0; while(p){ p=p->Next; j++; } return j; } //按序号查找 PtrToNode findkth(int k ,PtrToNode ptrl){ PtrToNode p=ptrl; int i=1; while(p!=NULL&&i<k){ p=p->Next; i++; } if(i==k)return p; else return NULL; } //按值查找 PtrToNode find(int X,PtrToNode ptrl){ PtrToNode p=ptrl; while(p!=NULL &&p->Data!=X) p=p->Next; return p; } //插入操作 PtrToNode insert(int X,int i,PtrToNode ptrl) { PtrToNode p,s; if(i==1){ s=(PtrToNode)malloc(sizeof(struct Node)); s->Data=X; s->Next=ptrl; return s; } p=findkth(i-1,ptrl); if(p==NULL){ printf("参数i错误"); return NULL; } else{ s=(PtrToNode)malloc(sizeof(struct Node)); s->Data=X; s->Next=p->Next; p->Next=s; return ptrl; } } //删除操作 PtrToNode del(int i,PtrToNode ptrl){ PtrToNode p,s; if(i==1){ s=ptrl; if(ptrl!=NULL)ptrl=ptrl->Next; else return NULL; free(s); return ptrl; } p=findkth(i-1,ptrl); if(p==NULL){ printf("第%d个节点不存在",i-1);return NULL; }else if(p->Next==NULL){ printf("第%d个节点不存在",i);return NULL; }else{ s=p->Next; p->Next=s->Next; free(s); return ptrl; } }执行结果如下图
至此完成单向链表的操作
相关文章推荐
- 单向链表的删除元素,添加元素等操作
- 单向链表操作详解(一)
- 单向链表的有关操作(链式存储结构)
- 数据结构——单向链表操作
- 链表的基本操作-单向链表
- 单向链表操作详解(二)[The End]
- 最基本的单向链表操作 C语言
- 单向链表的操作:创建,删除,插入,销毁,查找
- 单向链表操作详解(一)
- 单向链表操作(产生,删除,插入以及查询)
- 单向链表操作详解(一)
- 数据结构之链表与数组(三)-单向链表上的简单操作
- 数据结构之链表与数组(二) -单向链表上的简单操作问题
- 单向链表相关操作
- 单向链表的操作
- 单向链表操作详解(二)[The End]
- 单向链表的操作
- java 单向链表的操作
- 给定一个单向链表,目前已经有一个指针,指向某一个节点(记作A),现在要删除这个节点A,如何操作。
- 单向链表操作