24、链表操作
来源:互联网 发布:redis数据库安装配置 编辑:程序博客网 时间:2024/05/03 22:22
题目:
链表操作,
(1)单链表就地逆置,
(2)合并链表
程序如下:
#include <cstdio>#include <stdlib.h>typedef struct node{struct node *next;int value;}LinkList;void CreateList(LinkList *L);void Reverse(LinkList *L);void Output(LinkList *L);int main(){LinkList *L=(LinkList*)malloc(sizeof(LinkList)); //L为空头结点L->next=NULL;CreateList(L);printf("Before reverse,the items are: \n");Output(L);Reverse(L);printf("After reverse,the items are: \n");Output(L);return 0;}void CreateList(LinkList *L) //头插法建立单链表{int value;LinkList *tail=L,*newNode=NULL; //tail为链表尾结点printf("Please input values:\n");while (scanf("%d",&value)!=EOF){newNode=(LinkList*)malloc(sizeof(LinkList));newNode->value=value;newNode->next=NULL;tail->next=newNode;tail=newNode;}}void Reverse(LinkList *L) //把链表结点拆开,重新按尾插法建立单链表{LinkList*tail=L->next,*head=NULL,*s=NULL; //tail为链表尾部,head为断开的链表头结点,s为head后一个结点if (tail==NULL){return;}head=tail->next;tail->next=NULL;while (head!=NULL){s=head->next;head->next=tail;L->next=head;tail=head;head=s;}}void Output(LinkList *L){LinkList *r=L->next;while (r!=NULL){printf("%d ",r->value);r=r->next;}printf("\n");}
解释一下逆置算法:
还有一种方法:
从一本书上截了一张图
关键代码如下:
LinkList *p=head,*q;head=NULL;while (p!=NULL){q=p->next;p->next=head;head=p;p=q;}
给出完整代码:
#include <cstdio>#include <stdlib.h>typedef struct node{struct node *next;int value;}LinkList;void CreateList(LinkList *L);void Reverse(LinkList *L);void Output(LinkList *L);int main(){LinkList *L=(LinkList*)malloc(sizeof(LinkList)); //L为空头结点L->next=NULL;CreateList(L);printf("Before reverse,the items are: \n");Output(L);Reverse(L);printf("After reverse,the items are: \n");Output(L);return 0;}void CreateList(LinkList *L) //头插法建立单链表{int value;LinkList *tail=L,*newNode=NULL; //tail为链表尾结点printf("Please input values:\n");while (scanf("%d",&value)!=EOF){newNode=(LinkList*)malloc(sizeof(LinkList));newNode->value=value;newNode->next=NULL;tail->next=newNode;tail=newNode;}}void Reverse(LinkList *L) //把链表结点拆开,重新按尾插法建立单链表{LinkList*head=L->next,*p=NULL,*q=NULL; //tail为链表尾部,head为断开的链表头结点,s为head后一个结点if (head==NULL){return;}p=head;head=NULL;while (p!=NULL){q=p->next;p->next=head;head=p;if (q==NULL) //如果p为最后一个结点,则把头结点指向它{L->next=p;}p=q;}}void Output(LinkList *L){LinkList *r=L->next;while (r!=NULL){printf("%d ",r->value);r=r->next;}printf("\n");}
- 24、链表操作
- 实现链表基本操作(简单操作)
- 链表操作源程序
- 链表操作
- C++ 链表操作
- 链表的操作
- 链表操作源程序
- 链表的操作
- 链表的操作
- C++链表操作
- 链表操作
- 链表操作
- 链表基本操作
- LinkList链表操作
- 合并链表操作
- 链表简单操作
- 链表的操作
- 链表操作
- 实验报告 4--3
- 第五周实验报告2
- 怎样将图像转换为RGB图像模式
- Android ListView中图片的异步加载显示
- zoj 1337 Pi
- 24、链表操作
- iphone开发 SQLite数据库使用
- java中的序列化 serialization
- Eclipse android import 导入project 出错的解决办法
- TI准备使用Apical的HDR ISP IP核
- Unrecognized Windows Sockets error: 0: JVM_Bind 异常解决办法
- 使用plainText,显示JSP页面的代码
- Oracle数据库数据导入导出基本方法 .
- linux 根据进程名查看其占用的端口