带头节点的线性链表,对应数据结构教材章节2-3的算法2-8~2-11
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
int GetElem_L(LinkList L, int i, ElemType *e);
int ListInsert_L(LinkList *L, int i, ElemType e);
int ListDelete_L(LinkList *L, int i, ElemType *e);
void CreateList_L(LinkList *L, int n);
void MergeList_L(LinkList *la, LinkList *lb, LinkList *lc);
int GetElem_L(LinkList L, int i, ElemType *e)
{
struct LNode *p = L->next;
int j = 1;
while((p != NULL) && (j < i))
{
p = p->next;
j++;
}
if((p == NULL) || (j > i))
{
return -1;
}
*e = p->data;
return 0;
}
void CreateList_L(LinkList *L, int n)
{
*L = (LinkList)malloc(sizeof(struct LNode));
(*L)->next = NULL;
struct LNode *p = NULL;
for(int i = n; i > 0; i--)
{
p = (LinkList)malloc(sizeof(struct LNode));
p->data = i;
p->next = (*L)->next;
(*L)->next = p;
}
}
int ListInsert_L(LinkList *L, int i, ElemType e)
{
LinkList p = *L;
int j = 0;
while((p != NULL) && (j < (i-1)))
{
p = p->next;
j++;
}
if(p == NULL)
{
return -1;
}
LinkList s = (LinkList)malloc(sizeof(struct LNode));
s->data = e;
s->next = p->next;
p->next = s;
return 0;
}
int ListDelete_L(LinkList *L, int i, ElemType *e)
{
LinkList p = *L;
LinkList q = NULL;
int j = 0;
while((p->next != NULL) && (j < (i-1)))
{
p = p->next;
j++;
}
if(p->next == NULL)
{
return -1;
}
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return 0;
}
void MergeList_L(LinkList *la, LinkList *lb, LinkList *lc)
{
LinkList pc = NULL;
LinkList pa = NULL;
LinkList pb = NULL;
*lc = *la;
pc = *la;
pa = *la;
pb = *lb;
pa = pa->next;
pb = pb->next;
while((pa != NULL)&&(pb != NULL))
{
if(pa->data >= pb->data)
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
else
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
}
if(pa == NULL)
{
pc->next = pb;
}
else
{
pc->next = pa;
}
free(*lb);
}