下面提供一个简单的链表倒置方法,
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#include<time.h>
#define N 10
#define TRUE 1
#define FALSE 0
typedef int data_t;
//设置链表结构体
typedef struct node{
data_t data;
struct node *next;
}linknode,*linklist;
//创建链表头节点
void creat_list(linklist *head)
{
*head = (linklist)malloc(sizeof(linknode));
if(*head == NULL)
{
printf("malloc error! \n");
exit(FALSE);
}
(*head)->next=NULL;
}
//统计链表的长度
int length_list(linklist head)
{
linklist p;
int count=0;
p=head;
while( p->next != NULL)
{
count++;
p=p->next;
}
return count;
}
//插入链表数据
void insert_list(linklist head,data_t x,int i)
{
linklist p,q;
int j=1;
if(i<1 || i>length_list(head)+1)
{
printf("i is wrong!");
}
p=head;
q=(linklist)malloc(sizeof(linknode));
if(q == NULL)
{
printf("malloc error!");
exit(FALSE);
}
q->data=x;
q->next=NULL;
while(j < i)
{
p=p->next;
j++;
}
q->next=p->next;
p->next=q;
}
//使用头插法实现链表的倒置
void reverse_list(linklist head)
{
linklist p,q;
if(head == NULL)
{
exit(FALSE);
}
p=head->next;
head->next=NULL;
while(p != NULL)
{
q=p;
p=p->next;
q->next=head->next;
head->next=q;
}
}
//打印链表
void display_list(linklist head)
{
linklist p;
p=head->next;
while(p !=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//删除链表中某个位置的数
void delete_list(linklist head,int i)
{
linklist p,q;
int j=1;
p=head;
if(i<1 || i>length_list(head))
{
printf("i is wrong!\n");
exit(FALSE);
}
while(j<i)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
q=NULL;
}
int main(void)
{
int i=N,j;
int x,y,z;
linklist head=NULL;
creat_list(&head);
srand(time(NULL));
while(i>0)
{
j=rand()%100;//产生100以内的随机数
insert_list(head,j,1);
i--;
}
display_list(head);
printf("list long:%d\n ",length_list(head));
printf("insert number location::\n");
scanf("%d",&y);
printf("insert number:\n");
scanf("%d",&x);
insert_list(head,x,y);
display_list(head);
printf("delete list number:\n");
scanf("%d",&z);
printf("delete_list:\n");
delete_list(head,z);
display_list(head);
printf("reverse_list:\n");
reverse_list(head);
display_list(head);
return 0;
}