#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//声明节点结构
typedef struct Link
{
int data;
struct Link *next;
}link;
//初始化
void ListInitiate(link **head)
{
*head = (link *) malloc (sizeof(link));
(head)->next = NULL;
}
//求当前数据元素的个数
/
循环前,指针变量p指向头节点,计数变量size等于0.
循环的结束条件为p->next != NULL,循环中每次让指针p指向它的直接后继结点,让size加1.
最后函数返回计数值size
*/
int ListLength(link *head)
{
link *p = head;
int size = 0;
while(p->next != NULL)
{
p = p->next;
size++;
}
return size;
}
//插入
int ListInsert(link *head, int i, int x)
{
link *p, *q;
int j;
p = head;
j = -1;
while(p->next !=NULL && j < (i-1))
{
p = p->next;
j++;
}
if(j != i-1)
{
printf("插入元素位置参数错!");
return 0;
}
q = (link *)malloc(sizeof(link));
q->data = x;
q->next = p->next;
p->next = p;
return 1;
}
//删除
int ListDelete(link *head,int i,int *x)
{
link *p, *s;
int j;
p = head;
j = -1;
while(p->next != NULL && p->next->next != NULL && j < i-1)
{
p = p->next;
j++;
}
if(j != i-1)
{
printf("删除元素位置参数错!");
return 0;
}
s = p->next;
*x = s->data;
p->next = p->next->next;
free(s);
return 1;
}
//取数据元素
int ListGet(link *head,int i,int *x)
{
link *p;
int j;
p = head;
j = -1;
while(p->next != NULL && j<i)
{
p = p->next;
j++;
}
if(j != 0)
{
printf("取元素位置参数错!");
return 0;
}
*x = p->data;
return 1;
}
//撤销单链表
void Destory(link **head)
{
link *p, *p1;
p = *head;
while(p != NULL)
{
p1 = p;
p = p->next;
free(p1);
}
*head = NULL;
}
int main(void)
{
link *head;
int i,x;
ListInitiate(&head);
for(i=0; i<10; i++)
{
ListInsert(head,i,i+1);
}
ListDelete(head,4,&x);
for(i=0; i<ListLength(head); i++)
{
ListGet(head,i,&x);
printf("%d ",x);
}
Destory(&head);
return 0;
}