首页 > 编程知识 正文

链表基础知识总结,数据仓库面试题及答案

时间:2023-05-04 19:43:22 阅读:48250 作者:2212

制作链表的基本概念以及分配内存空间1 .链表,使每个节点的next指针指向下一个节点的地址即可。

程序代码:

# include cstdio//# includestdlibstructnode { int data; //数据域node* next; //指针字段; //链表node*create(intarray[] ) {node *p,*pre,*head; //pre保存当前节点的前驱节点,head是头节点head=new node; //创建头节点head-next=NULL开头节点不需要数据字段,指针字段的初始值为NULLpre=head; //记录pre为headfor(intI=0; i5; I () { p=新节点; //新节点//将新节点分配Array[i]作为数据和域,在scanf输入下p-data=Array[i]; p-next=空值; //新创建的节点指针字段为空前下一步=p; //前驱节点的指针字段包含当前新创建的节点的地址(连接链表) pre=p; //pre为p,作为下一个节点的前驱节点}返回头; //返回头指针}intmain((intarray ) ) 5、3、6、1、2 ); 节点* l=创建(阵列); //创建新的链表,返回开头指针head,代入LL=L-next; //从第一个节点开始数据域while(L!=null(printf('%d ',L-data ) ); //输出各节点的数据字段的L=L-next; }返回0; }

运行结果:

2 .查找元素搜索中是否存在给定的元素x,继续从第一个节点判断当前节点的数据字段是否等于x,如果等于,将计数器count加1。 这样到达链表的末尾时,count的值就是链表中元素x的数量。

程序代码 :

# include cstdio//# includestdlibstructnode { int data; //数据域node* next; //指针字段; //链表node*create(intarray[] ) {node *p,*pre,*head; //pre保存当前节点的前驱节点,head是头节点head=new node; //创建头节点head-next=NULL开头节点不需要数据字段,指针字段的初始值为NULLpre=head; //记录pre为headfor(intI=0; i5; I () { p=新节点; //新节点//将新节点分配Array[i]作为数据和域,在scanf输入下p-data=Array[i]; p-next=空值; //新创建的节点指针字段为空前下一步=p; //前驱节点的指针字段包含当前新创建的节点的地址(连接链表) pre=p; //pre为p,作为下一个节点的前驱节点}返回头; //返回头部的指针(以head为头部节点的链表中元素x的个数intsearch(node*head,int x ) {int count=0; //计数器node* p=head-next; while(p!=空(if ) p-data==x ) ) {count; (}p=p-next; }返回计数; (}int main ) ) intarray(5)={ 5,2,2,1,2 }; 节点* l=创建(阵列); //创建新的链表,返回开头指针head,代入LL=L-next; //从第一个节点开始,数据域printf(%d ),搜索(l ) ) l,2 ); 返回0; }

运行结果:

3 .对于要插入元素的链表来说,插入元素是指在链表的指定位置插入节点。 例如,如果在链表53612的第三个位置插入元素4,则链表为534612。 在第三个位置插入元素4意味着插入完成后,第三个位置的元素是4,从插入过程中指针的变化可以看出

元素4所在节点的指针字段next指向元素6所在节点的地址。

元素3所在节点的指针字段next指向元素4所在节点的地址。

程序代码:

# include cstdio//# includestdlibstructnode { int data; //数据域node* next; //指针字段; //创

建链表node* create(int Array[]) {node *p,*pre,*head;//pre保存当前结点的前驱结点,head为头结点head = new node;//创建头结点head->next = NULL;//头结点不要数据域,指针域初始为NULLpre = head;//记录pre为headfor(int i=0;i<5;i++) {p = new node;//新建结点//将Array[i]赋给新建的结点作为数据与域,也可以scanf输入 p->data = Array[i];p->next = NULL;//新建的结点指针域设为NULL pre->next = p;//前驱结点的指针域为当前新建的结点的地址(将链表连接起来) pre = p; //把pre设为p,作为下一个结点的前驱结点 }return head;//返回头指针 }//将x插入以head为头结点的链表的pos个位置上void insert(node* head,int pos,int x) {node* p = head;for(int i=1;i<pos-1;i++) {p = p->next;//pos-1是为了到插入位置的前一个结点 }node* q = new node;//新建结点q->data = x;// 新结点的数据域为xq->next = p->next;//新结点的指针域为当前结点的下一个结点p->next = q;//前一个位置的结点指向新结点 }int main(){int Array[5] = {5,3,4,1,2};node* L = create(Array); //新建链表,返回头指针head赋值给LL = L->next;//从第一个结点开始有数据域insert(L,4,6);for(int i=0;i<6;i++) {printf("%d",L->data);L = L->next;} return 0;}

运行结果:

注意:

插入数据操作顺序必须是先把新结点的指针域next指向后继结点,之后才能把前一个元素指向新的结点地址,否则会因为链接断开导致后面的地址失效。

 

 

4.删除元素

对链表来说删除元素是指删除链表上所有值为给定数x。

删除操作是这样进行的:

①由指针变量p枚举结点,另一个指针变量pre表示p指向结点的前驱结点。

②当p所指结点的数据域恰好为x时,进行下面三个操作。

令pre所指结点的指针域next指向p所指结点的下一个结点。释放p所指结点的内存空间。令p指向pre所指结点的下一个节点。

 

程序代码:

#include<cstdio> //#include<stdlib>struct node {int data;//数据域 node* next;//指针域 };//创建链表node* create(int Array[]) {node *p,*pre,*head;//pre保存当前结点的前驱结点,head为头结点head = new node;//创建头结点head->next = NULL;//头结点不要数据域,指针域初始为NULLpre = head;//记录pre为headfor(int i=0;i<5;i++) {p = new node;//新建结点//将Array[i]赋给新建的结点作为数据与域,也可以scanf输入 p->data = Array[i];p->next = NULL;//新建的结点指针域设为NULL pre->next = p;//前驱结点的指针域为当前新建的结点的地址(将链表连接起来) pre = p; //把pre设为p,作为下一个结点的前驱结点 }return head;//返回头指针 }//删除以head为头结点的链表中所有数据域为x的结点void del(node* head,int x) {node* p = head->next;//p从第一个节点开始枚举node* pre = head;//pre始终保存p的前驱结点的指针while(p != NULL) {if(p->data ==x){//数据域恰好为x pre->next = p->next;delete(p); p=pre->next;}else {pre = p;p = p->next;}}}int main(){int Array[5] = {5,3,3,1,2};node* L = create(Array); //新建链表,返回头指针head赋值给LL = L->next;//从第一个结点开始有数据域del(L,3); for(int i=0;i<3;i++) {printf("%d",L->data);L = L->next;} return 0;}

运行结果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。