📄 llist.c
字号:
/* 线性表的单链表表示:函数实现*/
#include <stdio.h>
#include <stdlib.h>
#include "llist.h"
/* 创建一个带头结点的空链表 */
LinkList createNullList_link( void ) {
LinkList llist;
llist = (LinkList)malloc( sizeof( struct Node ) ); /* 申请表头结点空间 */
if( llist != NULL ) llist->link = NULL;
return llist;
}
/* 在llist带头结点的单链表中下标为i的(第i+1个)结点前插入元素x */
int insert_link(LinkList llist, int i, DataType x) {
PNode p = llist, q;
int j;
for (j = 0 ; p != NULL && j < i; j++) /* 找下标为i-1的(第i个)结点 */
p = p->link;
if (j != i) { /* i<1或者大于表长 */
printf("Index of link-list is out of range.\n",i);
return 0;
}
q = (PNode)malloc( sizeof( struct Node ) ); /* 申请新结点 */
if( q == NULL ) {
printf( "Out of space!\n" );
return 0;
}
/* 插入链表中 */
q->info = x;
q->link = p->link;
p->link = q; /* 注意该句必须在上句后执行 */
return 1 ;
}
/* 在llist带有头结点的单链表中删除第一个值为x的结点 */
/* 这时要求 DataType 可以用 != 比较 */
int delete_link( LinkList llist, DataType x ) {
PNode p = llist, q;
/*找值为x的结点的前驱结点的存储位置 */
while( p->link != NULL && p->link->info != x )
p = p->link;
if( p->link == NULL ) { /* 没找到值为x的结点 */
printf("Datum does not exist!\n ");
return 0;
}
q = p->link; /* 找到值为x的结点 */
p->link = p->link->link; /* 删除该结点 */
free( q );
return 1;
}
/* 在llist带有头结点的单链表中找第一个值为x的结点存储位置 */
/* 找不到时返回空指针 */
PNode locate_link( LinkList llist, DataType x ) {
PNode p;
if (llist == NULL) return NULL;
for ( p = llist->link; p != NULL && p->info != x; )
p = p->link;
return p;
}
/* 在带有头结点的单链表llist中下标为i的(第i+1个)结点的存储位置 */
/* 当表中无下标为i的(第i+1个)元素时,返回值为NULL */
PNode find_link( LinkList llist, int i ) {
PNode p;
int j;
if (i < 0) { /* 检查i的值 */
printf("Index of link-list is out of range.\n",i);
return NULL;
}
for ( p = llist->link, j = 0; p != NULL && j < i; j++)
p = p->link;
if (p == NULL)
printf("Index of link-list is out of range.\n", i);
return p;
}
/* 判断llist带有头结点的单链表是否是空链表 */
int isNullList_link( LinkList llist) {
return llist == NULL || llist->link == NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -