单链表基本操作
来源:互联网 发布:淘宝怎样添加多个客服 编辑:程序博客网 时间:2024/05/20 03:37
- //vs2005
- #include "stdafx.h"
- #include <iostream>
- typedef struct node
- {
- int data;
- struct node *next;
- }LNode,*LinkList;
- /*创建链表:创建一个有头结点的链表,头结点不存放数据,数据从第二个结点(表头结点)开始存放。
- 有没有头结点链表的插入、删除、打印等操作会不同,有头结点通常操作起来更方便,例如可以方便的支持
- 只有一个节点的链表删除结点。
- 同时注意,对链表的操作中,插入和删除令p1=head,逆置令p1=head->next
- 前者有利于遍历
- */
- LinkList creat()
- {
- LinkList head,p,s;
- int x,flag=1;
- head=(LinkList)malloc(sizeof(LNode));//头指针
- p=head;
- printf("输入若干整数并以空格隔开,以回车结束:\n");
- char ch=' ';
- while(ch!='\n')
- {
- scanf("%d",&x);
- ch=getchar();//getchar要放在scanf后面
- if(flag)
- {
- s=(LinkList)malloc(sizeof(LNode));
- s->data=x;
- //printf("%d",s->data);
- //printf("\n");
- p->next=s;//输入的第一个数作为第二个结点(表头结点)
- p=s;
- }
- else flag=0;
- }
- p->next=NULL;
- printf("创建成功:\n");
- return head;
- }
- /*
- 删除节点:两种情况
- (1)删除第i个结点,直接删除即可
- (2)删除值为num的结点,要遍历整个链表,找出所有值为num的结点,全部删除
- 下面的代码考虑较复杂的第二种情况(也可以使用递归实现)
- */
- LinkList del(LinkList head,int num)
- {
- LinkList p1,p2;
- p1=head;
- while(p1->next!=NULL)
- {
- if(num!=p1->next->data)
- {
- p1=p1->next;
- }
- else
- {
- p2=p1->next;
- p1->next=p1->next->next;
- free(p2);
- }
- }
- ////////////////////////////////
- return head;
- }
- //逆置单链表
- LinkList reverse(LinkList head)
- {
- LinkList p1,p2,p3;
- //p1=head;
- p1=head->next;
- if(p1==NULL)return head;
- if(p1->next!=NULL)
- {
- p2=p1->next;
- p1->next=NULL;
- while(p2->next!=NULL)
- {
- p3=p2->next;
- p2->next=p1;
- p1=p2;
- p2=p3;
- }
- p2->next=p1;
- head->next=p2;
- }
- printf("逆置成功:\n");
- return head;
- }
- /*插入操作,常见的操作有:
- (1)插入到指定位置
- (2)插入到有序链表中,插入后仍然保持有序
- */
- LinkList insert(LinkList head)
- {
- LinkList p0,p1,p2;
- int num;
- p1=head;
- p0=(LinkList)malloc(sizeof(LNode));
- printf("请输入一个要插入的整数并回车:\n");
- char ch=' ';
- while(ch!='\n')
- {
- scanf("%d",&num);
- ch=getchar();
- }
- p0->data=num;
- if(head->next==NULL)
- {
- head->next=p0;
- p0->next=NULL;
- return head;
- }
- while(p1->next!=NULL&&p0->data>p1->next->data)
- p1=p1->next;
- if(p1->next==NULL)
- {
- p1->next=p0;
- p0->next=NULL;
- }
- else if(p0->data<=p1->next->data)
- {
- p0->next=p1->next;
- p1->next=p0;
- }
- printf("插入成功:\n");
- return head;
- }
- //打印链表
- void print(LinkList head)
- {
- LinkList p;
- if(head->next!=NULL)
- {
- p=head->next;
- while(p->next!=NULL)
- {
- printf("%d->",p->data);
- p=p->next;
- }
- printf("%d",p->data);
- }
- printf("\n");
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- LinkList p;
- p=creat();
- print(p);
- int num;
- printf("你要删除哪个元素,请输入:\n");
- scanf("%d",&num);
- p=del(p,num);
- print(p);
- p=insert(p);
- print(p);
- p=reverse(p);
- print(p);
- return 0;
- }
原文地址:点击打开链接
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表基本操作
- 单链表基本操作总结
- 单链表基本操作
- 单链表基本操作
- 单链表的基本操作
- c++ 单链表基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表基本操作
- 单链表(基本操作)
- C++ 单链表基本操作
- 单链表基本操作(一)
- 单链表的基本操作
- 单链表基本操作
- 单链表的基本操作!
- 实现字符串的语序翻转
- 中断服务程序编写规则
- 寻找一个字符串中连续出现次数最多的子串
- DataXceiverServer
- 比对图像相似度的一种方法
- 单链表基本操作
- 第三章 例3.2
- 合并有序链表
- 2012年软件开发者薪资调查报告
- 做个精致的程序员
- poj3233——矩阵
- H264 encode and decode overview
- 如何成为编程高手
- 后缀数组求最长重复子串