/* LinkList.c*/
/*线性表的单链表示:函数实现*/
#include <stdio.h>
#include <stdlib.h>
//#include "LinkList.h"
/*LinkList.h*/
/* 线性表的单链表示:类型和界面定义*/
/* 定义顺序表的元素类型。应根据需要修改 */
typedef int DataType;
struct Node; /* 单链表结点类型 */
typedef struct Node * PNode; /* 结点指针类型 */
struct Node
{ /* 单链表结点结构 */
DataType info;
PNode link;
};
typedef struct Node * LinkList; /* 单链表类型 */
LinkList createNullList_link( void )
/* 创建一个带头结点的空链表 */
{
LinkList llist = (LinkList)malloc( sizeof( struct Node ) );/*申请表头结点空间*/
if( llist != NULL )
llist->link = NULL;
else printf("Out of space! \n"); /*创建失败*/
return (llist);
}
int isNullList_link( LinkList llist)
{
/* 判断带有头结点的单链表llist是否是空链表 */
return (llist->link == NULL);
}
PNode locate_link(LinkList llist, DataType x )
{
/* 在llist带有头结点的单链表中找第一个值为x的结点存储位置 */
PNode p;
if (llist==NULL) return(NULL);
p = llist->link;
while( p != NULL && p->info != x ) p = p->link;
return (p);
}
PNode locatePre_link(LinkList llist, PNode p)
{
/*在单链表中求p所指结点的前驱结点*/
PNode p1;
if (llist==NULL) return(NULL);
p1 = llist;
while( p1 != NULL && p1->link != p ) p1 = p1->link;
return (p1);
}
int insertPost_link(LinkList llist, PNode p, DataType x)
{
/* 在llist带头结点的单链表中,p所指结点后面插入元素x */
PNode q = (PNode)malloc( sizeof( struct Node ) ); /* 申请新结点 */
if( q == NULL ) {printf( "Out of space!!!\n" ); return(0); }
else { q->info = x; q->link = p->link; p->link = q; return(1); }
}
int deleteV_link( LinkList llist, DataType x )
/* 在llist带有头结点的单链表中删除第一个值为x的结点 */
{
PNode p, q;
p = llist;
if(p==NULL) return(0);
while( p->link != NULL && p->link->info != x )
p = p->link; /*找值为x的结点的前驱结点的存储位置 */
if( p->link == NULL )
{ /* 没找到值为x的结点 */
printf("Not exist!\n "); return(0);
}
else
{
q = p->link; /* 找到值为x的结点 */
p->link = q->link; /* 删除该结点 */
free( q ); return(1);
}
}
/*
int deleteP_link(LinkLink llist,PNode p)
{
PNode *nQ;
nQ=locatePre_link(llist, p);
deleteV_link(llist, nQ->link)
}
*/
int main()
{
struct Node *pLinkList,*pN,*pM,*pP;
int i;
pLinkList=createNullList_link();
pP=pLinkList;
printf("%d\n",pLinkList->info);
printf("%d\n",pLinkList->link);
printf("uuuuuu\n\n\n");
//测试插入函数
for(i=0;i<5;i++)
{
printf("\n");
insertPost_link(pLinkList->link, pLinkList, i*10);
printf("%d\n",pLinkList->link);
printf("%d\n",pLinkList->link->info);
pLinkList=pLinkList->link;
if(pLinkList->info==20)
{
pN=pLinkList;
printf("$$$%d\n",pN->link);
printf("$$$%d\n",pN->info);
}
printf("\n\n");
}
printf("$$$%d\n",pN->link);
//测试查找定位函数
{
pM=locatePre_link(pP, pN);
printf("%d\n",pM->info);
printf("%d\n",pM->link);
pM=locate_link(pP,10);
printf("%d\n",pM->info);
printf("%d\n",pM->link);
}
//测试删除函数
{
deleteV_link( pP, 20 );
}
printf("\nend\n");
for(i=0;i<4;i++)
{
printf("%d\n",pP);
printf("%d\n",pP->link->info);
pP=pP->link;
}
return 0;
}
数据结构源码笔记(C语言描述)汇总: