#动态单链表的基本操作
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
typedef struct node *linklist;
//头插法生成链表
void createlist (linklist *head , int n)
{
linklist p , s;
int i;
//srand(time(0));
*head = (linklist) malloc(sizeof(struct node));
(*head)->next = NULL;
for (i = 0 ; i < n ; i ++)
{
p = (linklist)malloc(sizeof(struct node));
p->data = i;
p->next = (*head)->next;
(*head)->next = p;
}
}
//尾插法生成链表
void createtaillist (linklist *head , int n)
{
linklist p , r;
int i ;
*head = (linklist)malloc(sizeof(struct node));
r = *head;
for (i = 0 ; i < n ; i ++)
{
p = (linklist)malloc(sizeof(struct node));
p ->data = i;
r ->next = p;
r = p;
}
r ->next = NULL;
}
//单链表的插入 在第i个元素前插入元素
int listinsert (linklist *head , int i , int x)
{
int j;
linklist p , s;
p = *head;
j = 1;
while (p && j < i)
{
p = p ->next;
++ j;
}
if (!p || j > i) return 0;
s = (linklist)malloc(sizeof(struct node));
s ->data = x;
s ->next = p ->next;
p ->next = s;
return 1;
}
void printlist (linklist head)
{
linklist p ;
if (!head) return ;
for (p = head ->next ; p != NULL; p = p ->next) printf("%d\n",p->data);
}
//单链表的结点删除
int deletelist (linklist *head ,int i)
{
int j = 1;
linklist p , temp;
p = *head;
//用 p ->next 是因为删除这个结点是需要这个结点的前一个结点
//指向这个结点的后一个结点。
while (p ->next && j < i)
{
p = p ->next;
++ j;
}
if (!(p ->next) || j > i) return 0;
temp = p ->next;
p ->next = temp ->next;
free(temp);
return 1;
}
//单链表的整表删除
void freelist (linklist *head)
{
linklist p = (*head)->next , temp;
while (p)
{
temp = p ->next;
free(p);
p = temp;
}
(*head) ->next = NULL;
}
int main()
{
int i , x;
linklist head = NULL;
//createlist(&head , 10);
//for (i = 0 ; i < 1 ; i ++) add(&head , i);
createtaillist(&head , 10);
freelist(&head);
printlist(head);
puts("");
//for (i = 1 ; i < 6 ; i ++)
//{
// listinsert(&head , i + i , 100);
//}
deletelist (&head , 2);
printlist(head);
return 0;
}