/************************************************************************************************************
**File: list.c
**Author: Freeking
**Created: Sep 13th 2009
**Description: 关于链表的各种操作,包括创建链表,输出链表,插入链表,链表长度,定位链表元素(值或位置),
删除指定元素,删除链表,逆序输出链表等操作
***********************************************************************************************************/
#include<stdio.h>
#include<malloc.h>
typedef struct node{
int data;
struct node* next;
}LNode,*Linklist;
//创建一个空连
Linklist Create_Linklist()
{
Linklist Head;
Head = (Linklist)malloc( sizeof(LNode) );
if( Head )
{
Head->next = NULL;
}
return Head;
}
//创建一个长度为n的线性链表
void Create_Linklist_L( LNode *head, int n)
{
LNode *p, *q;
int i;
p = head;
for(i=1; i<=n; i++)
{
q=(Linklist)malloc(sizeof(LNode) );
printf("data%d:", i);
scanf("%d", &q->data);
q->next = NULL;
p->next = q;
p = q;
}
}
//输出链表
int print_Linklist( Linklist Headdress )
{
Linklist p;
if( !(Headdress) )
{
printf("链表错误!");
return -1 ;
}
p = Headdress;
while( NULL != p->next )
{
p = p->next;
printf("%d,", p->data);
}
return 0;
}
//求链表的长度
int Lenght_Linklist(Linklist H)
{
Linklist p = H;
int count = -1;
while( p )
{
p = p->next;
count++;
}
printf("The lenght of the list is:%d/n",count);
return count;
}
//查找第i个结点
Linklist Locate_Linklist_P( Linklist H, int i )
{
Linklist p = H;
int j = 0;
while( p&&j < i )
{
p = p->next;//查找第i个结点
j++;
}
if( j!= i || !p )
{
printf("参数 i 错或者单连表不存在!/n");
}
return p;
}
//按值查找第一个在链表中出现的值
Linklist Locate_Linklist_V( Linklist H, int x)
{
Linklist p = H->next;
while( p&&(p->data != x))
{
p = p->next;
}
return p;
}
//在指定的位置插入一个结点
int Insert_Linklist( Linklist H, int i, int data)
{
Linklist p, q;
p = Locate_Linklist_P(H, i-1);
if( !p )
{
printf("i error! /n");
return 0;
}
q = (Linklist)malloc(sizeof(LNode));
if( !q )
{
printf(" malloc error!/n" );
return -1;
}
q->data = data;
q->next = p->next;
p->next = q;
return 2;
}
//删除链表
Linklist Destroy_Linklist( Linklist H )
{
Linklist p;
Linklist q;
if(!H)
{
printf( " this is a empty list. error!/n");
return NULL;
}
p = H;
while( NULL != p )
{
q = p;
p = p->next;
free(p);
}
H = NULL;
return H;
}
//删除一个指定结点
Linklist Del_Linklist( Linklist H, int i )
{
Linklist p ,q;
if( !H->next )
{
printf( " this is a empty list. error!/n");
}
p = Locate_Linklist_P( H, i-1 );
q = p->next;
p->next = q->next;
free(q);
return H;
}
//单链表就地逆置
Linklist Reverselist( Linklist H )
{
Linklist p, q;
if(H->next && H->next->next )
{
p = H->next;
q = p->next;
p->next = NULL;
while( q )
{
p = q;
q = q->next;
p->next = H->next;
H->next = p;
}
return H;
}
return H;
}
int main()
{
Linklist Header;
Linklist p;
int i;
int data;
printf("Please input the number of the data:i=");
scanf("%d",&i);
Header = Create_Linklist();
Create_Linklist_L(Header,i);
Lenght_Linklist(Header);
printf("链表中的元素分别为:");
print_Linklist(Header);//输出链表
printf("/n请输入要查找的是第?个链表元素:");
scanf("%d",&i);
if( (p = Locate_Linklist_P( Header, i)) )
{
printf("第%d个链表元素值为:%d/n/n", i, p->data );
}
printf("请输入要查找的元素是否在链表中:");
scanf("%d",&i);
if( (p = Locate_Linklist_V( Header, i )) )
{
printf("值为:%d的元素在链表中/n/n ", p->data );
}
printf("请输入要在第?个的元素前插入值为?元素到链表中:");
scanf("%d%d", &i, &data);
Insert_Linklist(Header, i, data);
print_Linklist(Header);//输出链表
printf("/n请输入要删除的是第?个链表元素:");
scanf("%d",&i);
Del_Linklist(Header, i );
print_Linklist(Header);//输出链表
printf("/n逆序链表的输出为:");
Reverselist(Header);
print_Linklist(Header);//输出链表
if(!(p = Destroy_Linklist(Header )) )
{
printf("/n");
print_Linklist(p);//输出链表
}
}