天天看点

C语言中单链表的一些操作

#include<stdio.h>

#include<stdlib.h>

#include<strings.h>

struct node

{

int data;

struct node *next;

};

struct node *create_node(int num)

{

struct node *p=(struct node*)malloc(sizeof(struct node));//给结点分配空间;

if(p==NULL)

{

printf("create error\n");

}

bzero(p,sizeof(struct node));//清理堆空间

p->data=num;

p->next=NULL;

return p;

}

struct node *insert_head(struct node *pheader,struct node *new)

{

struct node *p=pheader;

new->next=p->next;

p->next=new;

}

struct node *insert_index(struct node *pheader,struct node *new,int num)

{

struct node *p=pheader;

int count=0;

if(p->next==NULL)

{

printf("链表为空\n");

}

while(p->next!=NULL)

{

p=p->next;

count++;

if(count==num)

{

new->next=p->next;

p->next=new;

break;

}

}

}

struct node *insert_tail(struct node *pheader,struct node *new)

{

struct node *p=pheader;

while(p->next!=NULL)

{

p=p->next;

}

p->next=new;

}

int reserve(struct node *pheader)

{

struct node *p=pheader;

struct node *p1=NULL;

struct node *p2=NULL;

struct node *p3=NULL;

if(p->next==NULL)

{

printf("链表为空\n");

return -1;

}

if(p->next->next==NULL)

{

printf("链表仅有一个有效节点\n");

return -1;

}

p1=p->next;

p2=p->next->next;

p3=p->next->next->next;

while(p3!=NULL)

{

p2->next=p1;

p1=p2;

p2=p3;

p3=p3->next;

}

p2->next=p1;

p->next->next=NULL;

    p->next=p2;

}

int delate(struct node *pheader,int num)

{

struct node *p=pheader;

struct node *pprev=NULL;

int flag=0;

if(p->next==NULL)

{

printf("链表为空\n");

}

while(p->next!=NULL)

{

pprev=p;

p=p->next;

if(p->data==num)

{

pprev->next=p->next;

free(p);              //释放被删的节点的空间

}

flag=1;

}

if(flag==0)

{

printf("没有要删除的数\n");

return -1;

}

}

int display(struct node *pheader)

{

struct node *p=pheader;

if(p->next==NULL)

{

printf("链表为空\n");

return -1;

}

while(p->next!=NULL)

{

p=p->next;

printf("p->data=%d\n",p->data);

}

printf("\n");

}

int main()

{

int i=0;

struct node *pheader=NULL;

pheader=create_node(11);

for(i=0;i<7;i++)

{

//insert_head(pheader,create_node(i+2));

insert_tail(pheader,create_node(i+2));

}

display(pheader);

//insert_index(pheader,create_node(20),3);

reserve(pheader);

display(pheader);

//delate(pheader,5);

//display(pheader);

return 0;

}