/*************************************************************************
> File Name: Mylist.c
> Author: wpx
> mail: #########
> Created Time: Tuesday, September 06, 2022 PM04:03:13 CST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
typedef struct List
{
Node head;//虚拟头
int length;
}List;
//获得新节点
Node* getnewNode(int val)
{
Node* node = (Node*) malloc (sizeof(Node));
node->data = val;
node->next = NULL;
return node;
}
//初始化链表
List* init_list()
{
List* list = (List*)malloc(sizeof(List));
//list->head.data = 0;
list->head.next = NULL;
list->length = 0;
return list;
}
//清除节点
void clear_node(Node* node)
{
if (!node) return;
free(node);
return ;
}
//清除链表
void clear(List* list)
{
if(!list) return ;
Node* p = &(list->head);
Node* q;
while(p != NULL)
{
q = p->next;
clear_node(p);
p = q;
}
free(list);
printf("链表清除成功!\n");
}
//插入 list ind val
int insert(List* list, int ind , int val)
{
if(!list) return 0;
if( ind < 0 || ind > list->length) return 0;
Node* node = getnewNode(val);
Node* p = &(list->head);
while(ind)
{
p = p->next;
ind--;
}
node->next = p->next;
p->next = node;
list->length++;
return 1;
}
//删除节点 list ind
int erase(List* list ,int ind)
{
if(!list ) return 0;
if(ind < 0 || ind >= list->length) return 0;
Node* p = &(list->head);
Node* q;
while(ind)
{
p = p->next;
ind--;
}
q = p->next;
p->next = q->next;
clear_node(q);
list->length--;
return 1;
}
//输出所有元素
void output(List* list )
{
if(!list) return ;
Node* p = list->head.next;
for(p ; p != NULL ; p = p->next)
{
printf("%d",p->data);
printf(" -> ");
}
printf("NULL \n");
}
//反转
void reverse(List * list)
{
if(!list) return;
printf("反转:\n");
Node* p = list->head.next;
list->head.next = NULL;
while(p)
{
Node* q = p->next;
p->next = list->head.next;
list->head.next = p;
p = q;
}
return;
}
int main()
{
List* list = init_list();
srand(time(0));
#define MAX_TOP 20
int i = 0;
for(i ; i < MAX_TOP; i++)
{
int op = rand()%4;
int val = rand()%100;
int ind = rand()%(list->length+3)-1;
switch (op)
{
case 0:
case 1:
case 2:
{
printf("insert %d at %d to list = %d\n",val,ind,insert(list,ind,val));
} break;
case 3:
{
printf("erase a item at %d from list = %d\n",ind,erase(list,ind));
} break;
default:
break;
}
output(list);
printf("\n");
}
#undef MAX_TOP
reverse(list);
output(list);
printf("\n");
clear(list);
return 0;
}
链表 C语言
最新推荐文章于 2024-09-20 14:41:15 发布