#include <stdio.h>
/*结点定义,下面定义lnode是结点的类型,linklist是指向lnode类型结点的指针类型。*/
typedef int datatype;
typedef struct node{
datatype data;
struct node *next;
}lnode,*linklist;
/*建立一个空的单链表。*/
linklist creat_linklist()
{
linklist H;
H = (linklist)malloc(sizeof(lnode));
if(H)
{
H->next = NULL;
}
return H;
}
/*查找单链表中的结点位置,方便后面的插入与删除结点。*/
linklist locate_linklist_pos(linklist H,int i){
linklist p;
int j;
p = H;
j = 0;
while(p && j < i)
{
p = p->next;
j++;
}
if((j != i) || !p)
{
printf("i error or the linklist is not exist");
return NULL;
}
return p;
}
/*在单链表的第i个结点前插入一个值为x的新结点。*/
int insert_linklist(linklist H,int i,datatype x){
linklist p;
linklist q;
p = locate_linklist_pos(H,i-1);
if(!p)
{
printf("i error!");
return 0;
}
q = (linklist)malloc(sizeof(lnode));
if(!q)
{
printf("fail to apply for space!");
return 0;
}
q->data = x;
q->next = p->next;
p->next = q;
return 1;
}
/*删除单链表中的第i个结点。*/
int delete_linklist(linklist H,int i){
linklist p;
linklist q;
if(H == NULL || H->next == NULL)
{
printf("the linklist is not exist!");
return 0;
}
p = locate_linklist_pos(H,i-1);
if(p == NULL || p->next == NULL)
{
printf("i error!");
return 0;
}
q = p->next;
p->next = q->next;
free(q);
return 1;
}
/*给空的单链表赋值。*/
void fuzhi_linklist(linklist H,int a[]){
linklist p;
linklist q;
int i;
p = H;
for(i = 0; i < 7; i++)
{
q = (linklist)malloc(sizeof(lnode));
q->data = a[i];
q->next = NULL;
p->next = q;
p = q;
}
}
/*打印单链表中的结果。*/
void show_linklist(linklist H){
linklist p = H->next;
while(p)
{
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
/*将单链表中的值逆序。*/
void reverse_linklist(linklist H){
linklist p;
linklist q;
p = H->next;
H->next = NULL;
while(p)
{
q = p;
p = p->next;
q->next = H->next;
H->next = q;
}
}
int main()
{
linklist H = creat_linklist();
int a[7] = {1,2,3,4,5,6,7};
fuzhi_linklist(H,a);
show_linklist(H);
insert_linklist(H,5,8);
show_linklist(H);
delete_linklist(H,4);
show_linklist(H);
reverse_linklist(H);
show_linklist(H);
return 0;
}