关于单链表的基本操作
2007-09-08 21:40
260 查看
#include <malloc.h>
#include <stdio.h>
//以下链表均带有头节点;头节点不存放数据,只起到带头作用。
typedef struct LNode{
int data;
struct LNode *next;
}LinkNode;
//单链表的建立(倒插入法)
LinkNode * CreatList(LinkNode *L,int n){
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
struct LNode * p;
int i;
for(i=n;i>0;--i){
p=(LinkNode*)malloc(sizeof(LinkNode));
printf("input the data:/n");
scanf("%d",&p->data);
p->next =L->next ;
L->next =p;
}
return L;
}
//单链表的测长
int GetLength(LinkNode *L){
LinkNode * p=L->next;
int len=0;
while(p!=NULL ){
len++;
p=p->next ;
}
return len;
}
//单链表的打印
void DisplayList(LinkNode *L){
struct LNode *p=L->next ;
while(p!=NULL ){
printf("%d/n",p->data);
p=p->next ;
}
}
//单链表(不包含头节点)的打印
void DisplayList1(LinkNode *L){
struct LNode *p=L;
while(p!=NULL ){
printf("%d/n",p->data);
p=p->next ;
}
}
//删除链表的头节点。
LinkNode * RemoveHead(LinkNode *L){
LinkNode *p =L;
p=p->next;
free(L);
return p;
}
//单链表改进冒泡排序
void BubbleSort(LinkNode *L){
LinkNode *p1;
if(L->next==NULL || L->next->next==NULL)
return ;
int length= GetLength(L);
int i,j,temp;
bool exchange;
for(j=1;j<length;j++)
{
exchange = false;
for(p1=L->next,i=0;i<length-j ;i++,p1=p1->next)
{
if(p1->data>p1->next->data)
{
temp=p1->data;
p1->data=p1->next->data;
p1->next->data=temp;
exchange=true;
}
if(!exchange)
return;
}
}
}
//有序单链表插入一个节点
LinkNode* LinkInsert(LinkNode *L,int element){
LinkNode *p0,*p1=L->next,*p2=L;
p0=(LinkNode*)malloc(sizeof(LinkNode));
p0->data=element;
if(p1==NULL){//L仅包含头节点,直接插入头节点后。
L->next= p0;
p0->next=NULL;
return L;
}
while(p1->next !=NULL && element>p1->data){
p2=p1;
p1=p1->next;
}
if(element<p1->data){
p2->next=p0;//插入到P2节点之后。
p0->next=p1;
}
else{//插入到最后一个节点的后面。
p1->next=p0;
p0->next=NULL;
}
return L;
}
//单链表删除指定节点
LinkNode *LinkDelete(LinkNode *L,int element){
LinkNode *p1=L->next,*p2=L;
if(p1==NULL){//L只包含头节点。
printf("list have not element!/n");
return L;
}
while(p1->next !=NULL && element !=p1->data){
p2=p1;
p1=p1->next;
}
if(element==p1->data)
p2->next=p1->next;
else{//搜索到最后没找到。
printf("%d not been found!/n",element);
return L;
}
free(p1);
return L;
}
//单链表逆置(包含头节点)
LinkNode * ReverseList(LinkNode *head){
LinkNode *p1,*p2,*p3;
if(head->next==NULL || head->next->next==NULL)
return head;
p1=head->next;
p2=p1->next;
while(p2)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
head->next->next=NULL;
head->next= p1;
return head;
}
//单链表逆置(不包含头节点)
LinkNode * ReverseList1(LinkNode *head){
LinkNode *p1,*p2,*p3;
if(head==NULL || head->next==NULL)
return head;
p1=head;
p2=p1->next;
while(p2)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
head->next=NULL;
head= p1;
return head;
}
//将两个非递减链表合并为一个非递减序链表
LinkNode* MergeList(LinkNode *La,LinkNode *Lb){
LinkNode *pa=La->next,*pb=Lb->next,*Lc,*pc;
Lc=pc=La;
while(pa!=NULL && pb!=NULL){
if(pa->data <= pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
if(pa==NULL)
pc->next=pb;
else
pc->next=pa;
free(Lb);
return Lc;
}
#include <stdio.h>
//以下链表均带有头节点;头节点不存放数据,只起到带头作用。
typedef struct LNode{
int data;
struct LNode *next;
}LinkNode;
//单链表的建立(倒插入法)
LinkNode * CreatList(LinkNode *L,int n){
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
struct LNode * p;
int i;
for(i=n;i>0;--i){
p=(LinkNode*)malloc(sizeof(LinkNode));
printf("input the data:/n");
scanf("%d",&p->data);
p->next =L->next ;
L->next =p;
}
return L;
}
//单链表的测长
int GetLength(LinkNode *L){
LinkNode * p=L->next;
int len=0;
while(p!=NULL ){
len++;
p=p->next ;
}
return len;
}
//单链表的打印
void DisplayList(LinkNode *L){
struct LNode *p=L->next ;
while(p!=NULL ){
printf("%d/n",p->data);
p=p->next ;
}
}
//单链表(不包含头节点)的打印
void DisplayList1(LinkNode *L){
struct LNode *p=L;
while(p!=NULL ){
printf("%d/n",p->data);
p=p->next ;
}
}
//删除链表的头节点。
LinkNode * RemoveHead(LinkNode *L){
LinkNode *p =L;
p=p->next;
free(L);
return p;
}
//单链表改进冒泡排序
void BubbleSort(LinkNode *L){
LinkNode *p1;
if(L->next==NULL || L->next->next==NULL)
return ;
int length= GetLength(L);
int i,j,temp;
bool exchange;
for(j=1;j<length;j++)
{
exchange = false;
for(p1=L->next,i=0;i<length-j ;i++,p1=p1->next)
{
if(p1->data>p1->next->data)
{
temp=p1->data;
p1->data=p1->next->data;
p1->next->data=temp;
exchange=true;
}
if(!exchange)
return;
}
}
}
//有序单链表插入一个节点
LinkNode* LinkInsert(LinkNode *L,int element){
LinkNode *p0,*p1=L->next,*p2=L;
p0=(LinkNode*)malloc(sizeof(LinkNode));
p0->data=element;
if(p1==NULL){//L仅包含头节点,直接插入头节点后。
L->next= p0;
p0->next=NULL;
return L;
}
while(p1->next !=NULL && element>p1->data){
p2=p1;
p1=p1->next;
}
if(element<p1->data){
p2->next=p0;//插入到P2节点之后。
p0->next=p1;
}
else{//插入到最后一个节点的后面。
p1->next=p0;
p0->next=NULL;
}
return L;
}
//单链表删除指定节点
LinkNode *LinkDelete(LinkNode *L,int element){
LinkNode *p1=L->next,*p2=L;
if(p1==NULL){//L只包含头节点。
printf("list have not element!/n");
return L;
}
while(p1->next !=NULL && element !=p1->data){
p2=p1;
p1=p1->next;
}
if(element==p1->data)
p2->next=p1->next;
else{//搜索到最后没找到。
printf("%d not been found!/n",element);
return L;
}
free(p1);
return L;
}
//单链表逆置(包含头节点)
LinkNode * ReverseList(LinkNode *head){
LinkNode *p1,*p2,*p3;
if(head->next==NULL || head->next->next==NULL)
return head;
p1=head->next;
p2=p1->next;
while(p2)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
head->next->next=NULL;
head->next= p1;
return head;
}
//单链表逆置(不包含头节点)
LinkNode * ReverseList1(LinkNode *head){
LinkNode *p1,*p2,*p3;
if(head==NULL || head->next==NULL)
return head;
p1=head;
p2=p1->next;
while(p2)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
head->next=NULL;
head= p1;
return head;
}
//将两个非递减链表合并为一个非递减序链表
LinkNode* MergeList(LinkNode *La,LinkNode *Lb){
LinkNode *pa=La->next,*pb=Lb->next,*Lc,*pc;
Lc=pc=La;
while(pa!=NULL && pb!=NULL){
if(pa->data <= pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
if(pa==NULL)
pc->next=pb;
else
pc->next=pa;
free(Lb);
return Lc;
}
相关文章推荐
- 关于PHP单链表的基本操作
- 关于单链表的一些基本操作
- 关于单链表的基本操作
- 关于单链表的基本操作
- 单链表的基本操作与排序
- 关于asp.net文件下载基本操作
- 关于链表的基本操作包括内容
- 关于oracle的一些基本知识点和操作
- 单链表的几种基本操作
- 关于多线程学习总结(三) 线程简单基本操作
- Oracle有关于用户的一些基本操作
- 单链表基本操作
- 单链表的基本操作(创建、删除、插入、遍历)
- EF CodeFirst关于数据库的一些基本操作
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- c++ 单链表基本操作
- linux基础学习笔记-2-关于控制台的基本操作
- 数据结构之 单链表的基本操作(创建、取值、插入、删除)
- Lua中关于函数库基本操作学习笔记
- JAVA中关于链表的操作和基本算法