链表的几种操作

来源:互联网 发布:淘宝创业好项目 编辑:程序博客网 时间:2024/06/05 00:11

//链表的几种操作,包括,创建链表,插入节点,遍历链表,删除节点,链表排序,链表逆序,销魂链表,获取链表长度

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
int id;
struct student* next;
}STU;
//创建头节点
STU* createchain()
{
//头节点
STU* head=NULL;
head = (STU*)malloc(sizeof(STU));
head->id = 0;
head->next = NULL;
return head;
}
//销毁链表
void freechain(STU* head)
{
STU* tmp = head;
STU* pnext;
while (tmp)
{
pnext = tmp->next;
free(tmp);
tmp = pnext;
}
}
//插入节点,尾插法
void insertnode(STU* head, STU data)
{
STU* tmp=head;
while (tmp->next)//求出链表尾节点
{
tmp = tmp->next;
}
tmp->next = (STU*)malloc(sizeof(STU));
tmp->next->id = data.id;
tmp->next->next = NULL;
}
//删除指定节点
void deletenode(STU* head, STU data)
{
STU* prev=head;
STU* tmp=head->next;
STU* next;
int flag = 0;
while (tmp->next) 
{
if (tmp->id == data.id)
{
flag = 1;
break;
}
prev = prev->next;
tmp = tmp->next;
}
if (flag)
{
if (!tmp->next)//判断是不是最后一个节点
{
prev->next = NULL;
free(tmp);
}
else
{
next= tmp->next;
prev->next = next;
free(tmp);
}
}
else
{
//指定的数据不存在
return;
}
}
//获取链表长度
int countlen(STU* head)
{
int len = 0;
STU* tmp = head->next;
while (tmp)
{
len++;
tmp = tmp->next;////////////////////
}
return len;
}
//遍历链表
void foreach(STU* head)
{
STU* tmp=head->next;
if (tmp == NULL)
{
printf("chain has no content\n");
return;
}
while (tmp)
{
printf("tmp->id=%3d\n", tmp->id);
tmp = tmp->next;
}
}
//链表逆序
STU* reversal(STU* head)
{
STU* thead = head;
STU* prev=head->next;
STU* tmp = prev->next;////////////////////////////
STU* pnext=tmp->next;
STU* firstnode = head->next;
while (pnext)
{
tmp->next = prev;
prev = tmp;
tmp = pnext;
pnext = pnext->next;
}
tmp->next = prev;
thead->next = tmp;


firstnode->next = NULL;
return thead;
}
//按顺序插入
void insertbyid(STU* head,STU data)
{
STU* tmp;
STU* pnext=NULL;
tmp = head->next;
int flag = 0;
int F;
if (countlen(head) < 1)
{
F = 0;
}
else
{
F = 1;
pnext = tmp->next;
}
while (pnext && F)
{
if (tmp->id <= data.id && pnext->id >= data.id)
{
flag = 1;
STU* insertnode = (STU*)malloc(sizeof(STU));
insertnode->id = data.id;
tmp->next = insertnode;
insertnode->next = pnext;
break;
}
tmp = tmp->next;
pnext = pnext->next;
}
if (!flag)
{
STU* insertnode = (STU*)malloc(sizeof(STU));
insertnode->id = data.id;
insertnode->next = NULL;
if(!F)
{
head->next = insertnode;
}
else
{
tmp->next = insertnode;
}
}
}
//链表排序
STU* chainsort(STU* head)
{

int len = countlen(head);
if (len <= 1)
return NULL;
STU* tmp=head->next;
STU* rehead = (STU*)malloc(sizeof(STU));
rehead->next = NULL;
while (tmp)
{
insertbyid(rehead, *(tmp));
tmp = tmp->next;
}
freechain(head);
printf("after sort chain len =%d\n", countlen(rehead));
return rehead;
}
//
//
int main()
{
//创建头节点
STU* head = createchain();
//插入数据
STU S1, S2, S3, S4, S5, S6, S7, S8;
S1.id = 1;S2.id = 2;S3.id = 3;S4.id = 4;
S5.id = 8;S6.id = 7;S7.id = 6;S8.id = 5;
insertnode(head, S1);insertnode(head, S2);
insertnode(head, S3);insertnode(head, S4);
insertnode(head, S5);insertnode(head, S6);
insertnode(head, S7);insertnode(head, S8);
//求链表节点数
printf("count chain node:%d\n", countlen(head));
//打印链表
foreach(head);
//删除节点
deletenode(head, S3);
//打印链表
printf("--------------------------------------------------------\n");
foreach(head);
//求链表节点数
printf("count chain node:%d\n", countlen(head));
//链表排序
STU* sequence = chainsort(head);
//打印链表
foreach(sequence);
//链表逆序
STU* reverse_chain = reversal(sequence);
//打印链表
printf("after reverse\n");
foreach(reverse_chain);
//销毁链表
freechain(reverse_chain);
system("pause");
return 0;
}

0 0