单链表的定义:
typedef struct Node { int data; struct Node* next; }Node,*LinkList;
单链表的初始化(带头节点):
bool InitList(LinkList* L) { *L = (LinkList)malloc(sizeof(Node)); if (*L == NULL) return false; (*L)->next = NULL; return true; }
判断单链表是否为空(带头节点):
bool Empty(LinkList L) { if (L->next == NULL) return true; else { return false; } }
单链表的整表创建(带头节点):
bool ListStart(LinkList* L, int n) { Node* p; int i; srand(time(0)); //初始化随机种子 *L = (Node*)malloc(sizeof(Node)); (*L)->next = NULL; //先建立一个带头结点的单链表 for (i = 0; i < n; i++) { p = (Node*)malloc(sizeof(Node)); //生成新结点 if (p == NULL) return false; //判断获取内存是否成功 p->data = rand() % 100 + 1; //随机生成100以内的数字 p->next = (*L)->next; (*L)->next = p; //采用头插法,插入到表头 } return true; }
显示整个单链表:
void ListShow(LinkList L) { printf("\n"); Node* p; //创建新结点,作为额外指针 p = L->next; //p越过头结点,指向第一个结点 while (p != NULL) { printf("%d-", p->data); //输出结点的值 p = p->next; //p指向下一个结点 } }
单链表插入(带头结点,头插法):
bool ListInsert(LinkList* L, int i, int* e)
{
if (i < 1)
return false; //插入位置不合法
Node * p, *s;
p = *L; //p作为额外指针
int j = 0; //j指示p的位置
while (p && j < i-1) //寻找i-1个结点
{
p = p->next;
j++;
}
if (p == NULL)
return false; //i不合法
s = (Node*)malloc(sizeof(Node));
s->data = *e;
s->next = p->next;
p->next = s;
return true;
}
单链表插入(带头结点,尾插法):
bool ListAdd(LinkList* L, int i, int* e) { if (i < 1) return false; Node* p; p = *L; int j = 0; while (p && j < i) //寻找第i个结点 { p = p->next; j++; } if (p == NULL) return false; Node* s; s = (Node*)malloc(sizeof(Node)); s->data = *e; s->next = p->next; p->next = s; //将s插入到第i个后面 return true; }
单链表删除(带头结点):
bool ListDelete(LinkList* L, int i, int* e) { if (i < 1) return false; int j = 0; Node* p; p = *L; while (p && j < i - 1) //寻找第i-1个结点 { p = p->next; j++; } if (p == NULL) //删除位置不合法,结点i-1超出链表 return false; if (p->next == NULL) //删除位置不合法,结点i超出链表 return false; Node* q = p->next; p->next = q->next; *e = q->data; free(q); return true; }
按位查找(带头结点):
bool GetElem(LinkList L,int i, int* e) { if (i < 1) return false; int j = 0; Node* p; p = L; while (p && j < i) { p = p->next; j++; } if (p == NULL) return false; *e = p->data; return true; }
按值查找(带头结点):
bool LocateElem(LinkList L, int e, int *i) { if (Empty(L)) return false; int j = 0; Node* p; p = L; while (p != NULL) { if (p->data == e) { *i = j; return true; } p = p->next; j++; } }
测试代码(main):
void main(void) { printf("begin\n"); LinkList L; int e,e1 = 16; ListStart(&L, 11); ListShow(L); GetElem(L, 6, &e); printf("n6=%d\n", e); ListInsert(&L, 3, &e1); ListShow(L); LocateElem(L, 16, &e); printf("值16-i=%d\n", e); ListShow(L); }
测试结果: