|

楼主 |
发表于 2019-10-8 20:51:24
|
显示全部楼层
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
//using namespace std;
typedef int elemtype;
typedef struct node //结点类型定义
{
elemtype data;
struct node *next;
} LinkList,node;
LinkList*Init_LinkList()/*初始化空的单链表*/
{ elemtype ix;
LinkList *head, *p;
head = (LinkList *) malloc ( sizeof( LinkList ) );
head->next = NULL;
return(head);
}
LinkList*Create_LinkListF()/*头插法建立带头结点的单链表函数*/
{ elemtype ix;
LinkList *head, *p;
head = (LinkList *) malloc ( sizeof( LinkList ) );
head->next = NULL;
printf("请输入数据直到输入0结束:\n");
scanf("%d", &ix);
while (ix != 0)
{ p = (LinkList *) malloc( sizeof( LinkList ) ); //①
p->data = ix; //②
p->next = head->next; //③
head->next = p; //④
scanf("%d", &ix);
}
return(head);
}
LinkList *Create_LinkListR( ) /*尾插法建立带头结点的单链表函数*/
{ elemtype ix;
LinkList *head, *p, *tail;
head = (LinkList *) malloc ( sizeof( LinkList ) );
head->next = NULL; tail = head;
printf("请输入数据直到输入0结束:\n");
scanf("%d", &ix);
while (ix != 0)
{ p = (LinkList *) malloc( sizeof( LinkList ) );
p->data = ix;
tail->next = p;
tail = p;
tail->next = NULL;
scanf("%d", &ix);
}
return( head );
}
void Print_LinkList( LinkList *head)//输出
{ LinkList *p = head->next;
while(p != NULL)
{ printf("%d ", p->data);
p = p->next;
}
}
int LinkList_Length (LinkList *head )//求长度
{ LinkList *p = head; /*p指向头结点*/
int j = 0;
while( p->next)
{ p=p->next; /*p所指的是第j个结点*/
j ++;
}
return j;
}
//按序号查找: 从链表的第一个结点起,判断当前结点是否是第i个,
//若是,则返回该结点的指针,否则继续下一个,直到表结束为止。没有第i个结点时返回空。
LinkList *GetData_LinkList(LinkList *head, int i)//返回第i个节点的指针
{ LinkList *p; int j = 0;
if (i <= 0) return NULL;
p = head;
while( p->next && j < i )
{ p = p->next;
j ++;
}
if ( i == j) return p;
else return NULL;
}
//按值查找:
//从链表的第一个结点起,判断当前结点是否等于key,若是,则返回该结点的指针,
//否则继续下一个,直到表结束为止。找不到时返回空。
LinkList *Search_LinkList(LinkList *head, elemtype key)//返回值为key的地址
{ LinkList *p;
p = head->next;
while( p)
if ( p->data != key )
p = p->next;
else
break;
return p;
}
//后插运算算法
void InsertAfter_LinkList(LinkList *p, elemtype x)//在结点p后面插入值为x的节点
{ LinkList *s;
s = (LinkList *) malloc ( sizeof( LinkList ) );
// ①生成新结点
s->data = x; //②新结点赋值
s->next = p->next; //③新结点链入
p->next = s; //④修改前趋结点的后向链
}
//在指定位置i插入x
int InsertNo_LinkList(LinkList*head,elemtype x,int i)
{
LinkList*p;
if(i<=0)p=NULL;
else if(i==1)p=head;
else
p=GetData_LinkList(head,i-1);
if(p==NULL)
{
return 0;
}
else
{
InsertAfter_LinkList(p,x);
return 1;
}
}
//删除后继结点算法
/*删除p的后继结点,成功返回1;否则返回0*/
int DeleteAfter_LinkList(LinkList *p)
{ LinkList *r;
if ( !p ) { return 0;}
r = p->next;
if ( !r )
{ return 0; }
p->next = r->next;
free( r );
return( 1 );
}
//删除单边表head的指定结点p
int DeleteNode_LinkList(LinkList*head,LinkList*p)
{
LinkList*r;
if(p->next!=NULL)
{
p->data=p->next->data;
return(DeleteAfter_LinkList(p));
}
else
{
r=head;
while(r->next!=p)
r=r->next;
return(DeleteAfter_LinkList(r));
}
}
//删除指定位置的结点:在带头结点的链表中删除第i个结点。删除第i个结点,就必须找到它的前驱结点,
//即第i – 1个结点p,然后再删除p的后继结点。
int DeleteNo_LinkList( LinkList *head, int i ) /*删除成功返回1,否则返回0*/
{ LinkList *p, *r;
if ( i == 0) p = NULL;
else if (i == 1 ) p = head;
else p = GetData_LinkList(head, i-1);/*搜索第i-1个结点*/
if ( p == NULL)
{
return 0;
}
else
{ r = p->next; p->next = r->next; /*删除指定结点*/
free( r );
return 1;
}
}
//将已存在的单链表的所有结点删除,释放其所占用的存储空间,使其成为带头结点的空链表。
LinkList * SetNull_LinkList(LinkList *head)
{ while (head->next)
DeleteAfter_LinkList(head); /*依次删除每个结点*/
return head;
}
|
|