分类: Delphi
2012-03-10 21:11:20
#include
#include
typedef int datatype;
//链表结构
typedef struct lnode
{
datatype data ;
struct lnode * next ;
}LNode , * LinkList ;
//头插法创建链表 ===不含头结点====
LinkList Creat_LinkList_TopMethod()
{
LinkList L ;
LNode * s ;
datatype x ;
// L->next = NULL ; 此句错误,因为还未知L, L->next就更不可能知道 记为1处错误
// L->data = 0 ;
L = NULL ;
scanf("%d",&x) ;
while(x != 0)
{
s = (LNode *)malloc(sizeof(LNode)) ;
s->data = x ;
// s->next = L->next ; 此处与1处错误同时做错
// L->next = s ; 此处与1处错误同时做错
s->next = L ;
L= s ;
scanf("%d",&x) ;
}
return L ;
}
//尾插法创建链表 ===不含头结点====
LinkList Creat_LinkList_TailMethod()
{
LinkList L = NULL ;
LNode * r , * s ;
datatype x ;
r = NULL ;
scanf("%d",&x) ;
while(x != 0)
{
s = (LNode *)malloc(sizeof(LNode)) ;
s->data = x ;
if(L == NULL) L = s ; // ****注意第一个节点的处理****
else r->next = s ;
r = s ; // ****注意第一个节点的处理****
scanf("%d",&x) ;
}
if(r != NULL) r->next = NULL ; //最后结点的处理。开始忘了写
return L ;
}
//求不带头结点的单链表的表长
int getLength_LinkList(LinkList L)
{
LNode * p ;
int i = 0 ;
p = L ;
while(p)
{
i++ ;
p = p->next ;
}
return i ;
}
LNode * findByValue(LinkList L , datatype x)
{
LNode * p ;
p = L ; //此为在不含头结点单链表中查找,若含头结点则只需将此句改为p = L->next ;
while(p && p->data != x)
{
p = p->next ;
}
return p ; //相当于这两句 if(p) return p ; else return NULL ;
}
LNode * findByNum(LinkList L , int i )
{
LNode * p ;
p = L ;
int j ;
for(j=0; j
p = p->next ;
}
return p ;
}
void Insert_LinkList(LinkList L ,int i , datatype x)
{
LNode * p,* s ;
p = findByNum(L,i-1) ;
s = (LNode *)malloc(sizeof(LNode)) ;
s->data = x ; //开始忘了写
s->next = p->next ;
p->next = s ;
}
void Delete_LinkList(LinkList L , int i)
{
LNode * p,*q ;
p = findByNum(L,i-1) ;
q = p->next ;
p->next = q->next ;
free(q) ;
}
//逆置
void reverse(LinkList &L)
{
LNode * p , *q ;
p = L ;
L = NULL ;//开始忘了写
while(p)
{
q = p ;
p = p->next ;
q->next = L ;
L = q ;
}
}
int main()
{
LinkList L , LA , LB , LC ;
LNode * p , * q , *s ;
int i , j;
/*
printf("头插法\n") ;
L = Creat_LinkList_TopMethod() ;
p = L ;
printf("头插结果:\n") ;
while(p)
{
printf("%d\n",p->data) ;
p = p->next ;
}
i = getLength_LinkList(L) ;
printf("表长") ;
printf("%d\n",i) ;
*/
printf("尾插法\n") ;
L = Creat_LinkList_TailMethod() ;
/*
p = L ;
printf("尾插结果:\n") ;
while(p)
{
printf("%d\n",p->data) ;
p = p->next ;
}
i = getLength_LinkList(L) ;
printf("表长") ;
printf("%d\n",i) ;
p = findByValue(L,3) ;
printf("查找数据为3的结点:") ;
if(p)printf("%d",p->data) ;
else printf("找不到\n") ;
p = findByNum(L,3) ;
printf("查找第三个结点的数据:\n") ;
if(p)printf("%d",p->data) ;
else printf("找不到\n") ;
Insert_LinkList(L,2,99) ;
printf("在第二个位置插入数据为99后结果:\n") ;
p = L ;
while(p)
{
printf("%d\n",p->data) ;
p = p->next ;
}
Delete_LinkList(L , 2) ;
printf("删除第二个元素之后") ;
p = L ;
while(p)
{
printf("%d\n",p->data) ;
p = p->next ;
}
*/
/*合并
LA = Creat_LinkList_TailMethod() ;
LB = Creat_LinkList_TailMethod() ;
*/
reverse(L) ;
p = L ;
while(p)
{
printf("%d\n",p->data) ;
p = p->next ;
}
}