线性表链式表示和实现:初始化及查找、插入、删除的实现
代码
#include <stdio.h>
#include <stdlib.h>
#define ERROR NULL
typedef struct LNode *PtrToLNode;
struct LNode {
int Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
PtrToLNode MakeEmpty( )
{
PtrToLNode L;
L = (List)malloc(sizeof(LNode));
if (!L)
return 0;
L->Next = NULL;
return L;
}
void CreateList_L1(List &L, int m[], int n){
List p;
int i = 0;
L = (List)malloc(sizeof(LNode));
L->Next = NULL;
for (i = 0; i < n; i++) {
p = (List)malloc(sizeof(LNode));
p->Data = m[i];
p->Next = L->Next;
L->Next = p;
}
}
void CreateList_L2(List &L, int m[], int n) {
List p,r;
int i = 0;
L = (List)malloc(sizeof(LNode));
r = L;
for (i = 0; i < n; i++) {
p = (List)malloc(sizeof(LNode));
p->Data = m[i];
r->Next = p;
r = p;
}
r->Next = NULL;
}
int length(List PtrL) {
List p = PtrL;
int j = 0;
while (p) {
p = p->Next;
j++;
}
return j;
}
int Find(int X, List &L )
{
List p = L->Next;
while (p && p->Data != X)
p = p->Next;
if (p)
return p->Data;
else
return ERROR;
}
int Find2(int K, List &PtrL) {
List p = PtrL;
int i = 0;
while (p != NULL && i < K) {
p = p->Next;
++i;
}
if (i == K) return p->Data;
else return NULL;
}
int Insert(List &L, int i,int e ) {
List p = L;
int j = 0;
while (p&&j < i - 1) {
p = p->Next; ++j;
}
if (!p || j > 1 - 1) {
printf("参数i错");
return ERROR;
}
List s = (List)malloc(sizeof(struct LNode));
s->Data = e;
s->Next = p->Next;
p->Next = s;
return 0;
}
int Delete(List &L, int i)
{
List p = L;
int j = 0;
while (p->Next&&j < i - 1) {
p = p->Next; ++j;
}
if (!p->Next || j > i - 1) {
printf("第%d个结点不存在", i - 1);
return ERROR;
}
List q = (List)malloc(sizeof(struct LNode));
q = p->Next;
p->Next = q->Next;
free(q);
return 0;
}
void output(List L) {
List p;
p = L;
printf("此时PtrL线性表元素为\n");
p = L->Next;
while (p) {
printf("%d ", p->Data);
p = p->Next;
}
printf("\n");
}
int main() {
List PtrL;
int p1, p2;
p1 = 0;
p2 = 0;
int i = 0;
int m[100];
for (i = 0; i < 5; i++) {
scanf("%d", &m[i]);
}
CreateList_L2(PtrL,m, 5);
printf("PtrL->Data大小为%d位\n", sizeof(PtrL->Data) / sizeof(int));
printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));
output(PtrL);
printf("第1位插入1000\n");
Insert(PtrL,1,1000 );
printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));
output(PtrL);
printf("删除第2位\n");
Delete(PtrL,2);
printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));
output(PtrL);
printf("查找2的位置\n");
p1= Find(4, PtrL);
printf("2在PtrL第%d位\n", p1);
printf("查找第1位\n");
p2 = Find2(1, PtrL);
printf("第1位在PtrL为%d\n", p2);
return 0;
}
运行
1 2 3 4 5
PtrL->Data大小为1位
PtrL->Data长度共6位(包含\0位)
此时PtrL线性表元素为
1 2 3 4 5
第1位插入1000
PtrL->Data长度共7位(包含\0位)
此时PtrL线性表元素为
1000 1 2 3 4 5
删除第2位
PtrL->Data长度共6位(包含\0位)
此时PtrL线性表元素为
1000 2 3 4 5
查找2的位置
2在PtrL第4位
查找第1位
第1位在PtrL为1000
|