带头节点的线性链表,对应数据结构教材章节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); }