首页 > 代码库 > 创建单线性链表的不同表示方法和操作
创建单线性链表的不同表示方法和操作
创建单线性链表,常见的有头插法、尾插法创建线性链表,常见的操作有:创建链表、查找、删除、增加元素、求逆链等操作。
这里首先用头插法创建链表:
//头指针唯一确定一个单链表
#define MaxSize 15 typedef int elem_type ; typedef struct linklist { elem_type data; struct linklist *next; } Linklist; //头插入法建立链表:每次将头结点的指针赋值给新结点,然后将新节点赋值给头结点指针 Linklist *CreateList () { Linklist *head,*p; head =(Linklist *)malloc(sizeof(Linklist)); head->next=NULL; // p =(Linklist *)malloc(sizeof(Linklist)); int i; cout<<"随机产生一个数字:"<<endl; for(i=0;i<MaxSize;i++) { int data; data =http://www.mamicode.com/rand()%100;> //利用头插法创建的链表有什么特点呢?这里可以写个查找函数来说明:
定义一个查找函数:
//查找(取出第i个数的值) elem_type Get_Elem(Linklist *L, int i) { int j; Linklist *p; p=L->next; if((i>MaxSize) && (i< 0)) cout<<"输入有效的i值"; for(j=0;j<i-1;j++) { p=p->next; //flag->next++; //链表不是矩阵,指针自加1不是指向下一个结点,那是矩阵里可以这样。 } return p->data; }编译一下:结果如下//主函数如下:
int main() { Linklist *Q; Q=CreateList(); int i; cout<<"输入想要查找的元素号i="; cin>>i; int getNum = Get_Elem( Q , i); cout<<"第"<<i<<"个元素是"<<getNum<<endl; //Insert_Elem(Q, 3,5); while(1); return 0; }
根据运行结果可知道:对于头插法,输入的结点次序和生成的链表次序相反。还有可以有:删除元素和增添元素的函数体:
//删除链表中的某个结点 void Delete_Linklist(Linklist *L,elem_type i) { Linklist *p,*q; p=L->next; int j=0; if(i<0 && i>MaxSize ) cout<<"j输入有效的i值"; else { while((p->next != NULL)&&(j<i-1)) { p=p->next; //寻找第i个结点 ++j; } q=p->next; p->next=q->next; free(q); } } //添加结点(在第i个节点处添加一个值) void Insert_Elem(Linklist *L, int i, elem_type Number) { int j; Linklist *p,*q; p=L->next; if((i>MaxSize) && (i< 0)) cout<<"输入有效的i值"; for(j=0;j<i-1;j++) { p=p->next; //flag->next++; //链表不是矩阵,指针自加1不是指向下一个结点,那是矩阵里可以这样。 } if(i==j+1) { q=(Linklist *)malloc(sizeof(Linklist)); q->data=http://www.mamicode.com/Number;>
问题分析:为什么头插法的数据元素顺序和链表中结点顺序相反?
循环第一次时:
p->data =http://www.mamicode.com/data; //数据元素第一次赋值>循环第二次时:
p->data =http://www.mamicode.com/data; //数据元素第二次赋值>所以新赋值进来的结点更靠近head->next.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。