480
社区成员




目录
线性表是一种常见的数据结构,它由一组有序的元素组成,每个元素最多只有一个前驱和一个后继。线性表可以分为两种类型:顺序表和链表。
顺序表是一种用数组实现的线性表,它的元素在内存中连续存储。顺序表的特点是:
顺序表的实现代码如下:
#define maxsize 100 //线性表可能达到的最大长度
typedef struct {
ElemType elem[maxsize]; //线性表占用的数组空间
int last; //记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为 -1
} SeqList;
算法思路
int Locate (SeqList L, ElemTypee) {
int i = 0 ; /*i不仅是下标,也作为计数器,初值为0*/
while ( (i <= L.last) && (L.elem[i] != e ) ) i++;
/*顺序扫描表,直到找到值为e的元素,或扫描到表尾也没找到*/
if (i <= L.last)
return (i + 1); /*找到值为 e 的元素,则返回其序号
(序号比下标多1)*/
else
return (-1); /*没找到,返回空序号*/
}
算法思路
int InsList (SeqList *L, int i, ElemType e) {
int k;
if ( (i < 1) || (i > L->last + 2) ) { /*首先判断插入位置是否合法*/
printf("插入位置i值不合法");
return (ERROR);
}
if (L->last >= maxsize - 1) {
printf("表已满无法插入");
return (ERROR);
}
for (k = L->last; k >= i - 1; k--) /*为插入元素而移动位置*/
L->elem[k + 1] = L->elem[k];
L->elem[i - 1] = e; /*在C语言中数组第i个元素的下标为i-1*/
L->last++;
return (OK);
}
算法思路
int DelList(SeqList *L, int i, ElemType *e) {
int k;
if ((i < 1) || (i > L->last + 1)) {
printf("删除位置不合法!");
return (ERROR);
}
*e = L->elem[i - 1]; /* 将删除的元素存放到e所指向的变量中*/
for (k = i; k <= L->last; k++)
L->elem[k - 1] = L->elem[k]; /*将后面的元素依次前移*/
L->last--;
return (OK);
}
链表是一种用链式结构实现的线性表,它的元素在内存中不连续存储。链表的特点是:
链表的实现代码如下:
typedef struct Node // 结点类型定义
{
//ElemType 具体类型据实际设定, 如int,char等
ElemType data;
struct Node * next;
}Node,
*LinkList; //LinkList为结构指针类型
void InitList(LinkList *L) {
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}
LinkList InitList( ) {
LinkList L = (LinkList)malloc(sizeof(Node));
L->next = NULL;
return L;
}
算法思路
void CreateFromHead(LinkList L) {
Node *s;
int flag = 1; //标志--初值为1,当输入‘$’时,flag为0,建表结束
while (flag) {
char c = getchar(); //接收一字符
if (c != '$') { //如果字符不是‘$’,则执行头插
s = (Node *)malloc(sizeof(Node));
s->data = c;
s->next = L->next;
L->next = s;
} else {
flag = 0;
}
}
}
算法思路
void CreateFromTail(LinkList L) {
Node *r, *s;
int flag = 1; //标志--初值为1,当输入“$”时,flag为0,建表结束
r = L;
while (flag) {
c = getchar(); //接收一字符
if (c != '$') //如果字符不是’$’,则执行尾插
s = (Node *)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
else {
flag = 0;
r->next = NULL;
}
}
}
算法思路
int InsList(LinkList L, int i, ElemType e) {
/*在带头结点的单链表L中第i个结点之前插入值为e的新结点。 */
Node *pre, *s;
int k;
if (i < 1) return Error;
pre = L;
k = 0;
while (pre != NULL && k < i - 1) {
pre = pre->next;
k = k + 1;
}
if (!pre) {
printf("插入位置不合理!");
return Error;
}
s = (Node*)malloc(sizeof(Node)); //为e申请一个新的结点
s->data = e; /*将待插入结点的值e赋给s的数据域*/
s->next = pre->next;
pre->next = s;
return OK;
}
算法思路
int DelList(LinkList L, int i, ElemType *e) {
Node *pre,
*r;
int k;
pre = L;
k = 0;
while (pre->next != NULL && k < i - 1) {
pre = pre->next;
k = k + 1;
}
if ( !(pre->next) ) {
printf("删除结点的位置 i 不合理!");
return ERROR;
}
r = pre->next;
pre->next = pre->next->next /* 删除结点 r */
*e = r->data;
free(r);
return OK;
}
算法思路
Node * GetData(LinkList L, int i) {
int j;
Node *p;
if (i <= 0)
return NULL;
p = L;
j = 0;
/ * 从头结点开始扫描 * /
while ( (p->next != NULL) && (j < i) ) {
p = p->next;
j++;
}
if (i = = j)return p;
/* 找到了第i个结点 */
else return NULL;
/* 找不到,i > n */
}
算法思路
Node *Locate( LinkList L, ElemType key) {
Node *p;
p = L->next;
/ * 从表中第一个结点比较 * /
while (p != NULL)
if (p->data != key)
p = p->next;
else
break;
/ * 找到结点key,退出循环 * /
return p;
}
算法思路
int ListLength(LinkList L) { /*L为带头结点的单链表*/
Node *p;
p = L->next;
j = 0; /*用来存放单链表的长度*/
while (p != NULL) {
p = p->next;
j ++;
}
return j;
}
算法思路
LinkList MergeLinkList(LinkList LA, LinkList LB)
/*将递增有序的单链表LA和LB合并成一个递增有序的单链表LC*/
{
Node *pa, *pb;
Node *r;
LinkList LC;
/*将LC初始置空表。pa和pb分别指向两个单链表LA和LB中的第一个结点,r初值为LC*/
pa = LA->next;
pb = LB->next;
LC = LA;
LC->next = NULL;
r = LC;
/*当两个表中均未处理完时,比较选择将较小值结点插入到新表LC中。*/
while (pa != NULL && pb != NULL) {
if (pa->data <= pb->data) {
r->next = pa;
r = pa;
pa = pa->next;
} else {
r->next = pb;
r = pb;
pb = pb->next;
}
}
if (pa) /*若表LA未完,将表LA中后续元素链到新表LC表尾*/
r->next = pa;
else /*否则将表LB中后续元素链到新表LC表尾*/
r->next = pb;
free(LB);
return (LC);
}