版权声明:原创文章,转载请注明原文地址。 https://blog.csdn.net/it_r00t/article/details/79859094
//
// main.c
// LinkList
//
// Created by Jacobs.Guo on 2018/4/3.
// Copyright © 2018年 yage guo. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int status;
typedef struct Node
{
ElemType data;
struct Node *next;
} Node;
typedef struct Node *LinkList;
//单链表的整表创建(头插法)
//param:LinkList *L 没有任何节点的单链表
//Param:int n 整数N,代表插入节点的个数
void CreateListHead(LinkList *L,int n)
{
LinkList q;int i;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;//构建头结点
// srand((unsigned)time(NULL));
for (i = 0;i<n;i++)
{
q = (LinkList)malloc(sizeof(Node));
// q->data = rand() % 101;
q->data = (i+1)*10;
q->next = (*L)->next;
(*L)->next = q;
}
}
//单链表的整表创建(尾插法)
void CreateListTail(LinkList *L,int n)
{
LinkList q,r;int i;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
r = *L;
for (i = 0;i<n;i++)
{
q = (LinkList)malloc(sizeof(Node));
q->data = (i+1)*10;
r->next = q;
r = q;
}
r->next = NULL;
}
//单链表的整表删除
status ClearList(LinkList *L)
{
LinkList p,q;
p = (*L)->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
return OK;
}
//删除单链表的第I个节点
status ListDelete(LinkList *L,int position)
{
LinkList p,q;int i=1;
p = (*L)->next;
while (p->next && ((i++)<position-1))
{
p = p->next;
}
if ((!p->next) || position > i) return ERROR;
q = p->next;
p->next = q->next;
free(q);
return OK;
}
//单链表的插入操作,在第position个位置上插入元素e
status InsertList(LinkList *L,int position,ElemType e)
{
LinkList p,q;int i=1;
p = *L;
while (p->next && (i++)<position)
{
p = p->next;
}
if (i < position) return ERROR;
q = (LinkList)malloc(sizeof(Node));
q->data = e;
q->next = p->next;
p->next = q;
return OK;
}
status visit(ElemType c)
{
printf("%d ",c);
return OK;
}
// 依次对L的每个数据元素输出
status ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}
int main() {
LinkList L,La;
printf("使用头插法顺序插入节点数据域为10、20、30、40、50之后的单链表L:\n");
CreateListHead(&L, 5);
ListTraverse(L);
printf("使用尾插法顺序插入节点数据域为10、20、30、40、50之后的单链表L:\n");
CreateListTail(&La, 5);
ListTraverse(L);
if (ClearList(&La)) printf("La表已经清空\n");
printf("\n");
printf("删除单链表L的第2个节点之后单链表的数据为:\n");
ListDelete(&L, 2);
ListTraverse(L);
printf("在单链表L的第2个位置添加数据域为100的节点之后:\n");
InsertList(&L, 2, 100);
ListTraverse(L);
ClearList(&L);
return 0;
}