如果您对于单链表不是很熟悉,请看 单链表的简单介绍
#include <stdio.h>
#include <stdlib.h>
#define Status int //状态
#define OVERFLOW -1 //溢出
#define OK 1 //正确
#define ERROR 0 //错误
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status InitList_L(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(LNode));
if ((*L) == NULL)
{
exit(0);
}
(*L)->next = NULL;
return OK;
}
// 算法2.8
Status GetElemt_L(LinkList L, int i, ElemType *e)
{
int j;
LinkList p = L;
p = p->next;
for (j = 1; p != NULL&&j < i; j++)
{
p = p->next;
}
if (p == NULL||j > i)
{
printf("您要找的节点不存在");
}
*e = p->data;
return OK;
}
//算法2.9.0
Status ListInsert_L(LinkList *L, int i, ElemType e) //这样修改应该不对 p = *L出错
{
int j;
LinkList p = *L;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
for (j = 1; p != NULL&&j < i; j++)
{
p = p->next;
}
if (p == NULL || j > i )
{
printf("您要的节点不在");
}
else
{
s->next = p->next;
p->next = s;
}
return OK;
}
//算法2.10.0
Status ListDelete_L(LinkList *L, int i, ElemType *e)
{
int j;
LinkList p = *L;
for (j = 1; p->next != NULL&&j < i; j++)
{
p = p->next;
}
if (p->next == NULL||j > i)
{
printf("您要找的节点不存在");
}
LinkList q = p->next;
p->next = q->next;
free(q);
return OK;
}
//算法2.11.0
void CreateList_L(LinkList *L, int n) {
LinkList p = *L;
p = p->next;
for (int i = 0; i < n; i++)
{
LinkList q = (LinkList)malloc(sizeof(LNode));
p->next = q;
p = q;
}
} // CreateList_L
//算法2.12
void MergeList_L(LinkList *La, LinkList *Lb, LinkList *Lc) {
LinkList p1 = (*La)->next;
LinkList p2 = (*Lb)->next;
LinkList p3 = *Lc;
while (p1 != NULL&&p2 != NULL)
{
if (p1->data >= p2->data)
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
else
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
}
if (p1 != NULL)
{
p3->next = p1;
}
if (p2 != NULL)
{
p3->next = p2;
}
} // MergeList_L
Status visit(ElemType e) {
if (printf("%d ", e))
return OK;
return ERROR;
}
Status visit1(ElemType e) {
if (printf("%d\n", e))
return OK;
return ERROR;
}
// 遍历
Status ListTraverse_L(LinkList L, Status(*pvisit)(ElemType)) {
LNode *p = L->next;
while (p) {
if (!pvisit(p->data))
return ERROR;
p = p->next;
}
printf("\n");
return OK;
}
int main(void)
{
LinkList L;
ElemType e, dataArr[5] = { 11, 22, 33, 44, 55 };
int i;
InitList_L(&L);
printf("L = %p\n", L);
printf("L->next = %p\n", L->next);
printf("L->data = %d\n", L->data);
for (i = 1; i <= 5; i++)
{
ListInsert_L(&L, i, dataArr[i - 1]);
}
ListTraverse_L(L, visit);
ListDelete_L(&L, 2, &e);
ListTraverse_L(L, visit);
return 0;
}
//测试CreateList_L
//int main(void)
//{
// LinkList L;
// CreateList_L(&L, 6);
// ListTraverse_L(L, visit);
//
// return 0;
//}
End...