目录
头插法
Link tcreatelist()
{
int value,len;
Link head = (Link)malloc(sizeof(link));//先创建头结点,头结点的数据域没有值
head->next = NULL; //使头结点下一个节点指向NULL
printf("input the node you want!!\n");
scanf("%d",&len); //输入要输入链表的长度
for(int i=0;i<len;i++)
{
scanf("%d",&value);
Link a = (Link)malloc(sizeof(link));//创建新结点
a->data=value; //将输入值赋给这个结点的数据域
a->next=head->next; //让这个新结点的下一个结点指向头结点的下一个结点
head->next=a; //让头结点的下一个结点指向这个新结点
}
return head; //返回链表头
}
尾插法
Link wcreatelist()
{
int value,len;
Link head = (Link)malloc(sizeof(link)); //表示头结点
Link tail = head; //定义一个尾指针,这个尾指针也指向这个头结点
head->next = NULL; //头结点的下一个结点指向NULL
scanf("%d",&len); //输入链表的长度
for(int i =1;i<=len;i++)
{
Link a = (Link)malloc(sizeof(link));//创建新结点
scanf("%d",&value); //输入结点中要保存的值
a->data = value; //将这个值赋给新结点的数据域
a->next = NULL; //使该结点的下一结点指向NULL
tail->next = a; //尾节点的下一结点指向新结点a
tail = a; //将尾节点指向a
}
return head; //返回头指针
}
整表删除
Link delelist(Link linklist)
{
Link node,q;
node = linklist->next; //首先让node指向首结点(注意不是头结点)
while(node) //遍历除头结点之外的所有结点
{
q=node->next; //让q结点指向下一结点,如果不保存下面就找不到下一结点了
free(node); //释放掉node结点,删除了这个结点,释放了其所占的内存
node = q; //使node指向刚刚保存的下一结点
}
linklist->next = NULL; //将首节点置为空
return linklist;
}
插入单个节点
Link insertnode(Link linklist,int num,int value) //第一个参数表示链表的头指针,第二个表示插入
//的位置,第三个为要插入的值
{
Link head = linklist; //定义一个head指针,让该指针指向链表的头结点
Link addnode = (Link)malloc(sizeof(link)); //为要插入的结点动态分配内存
for(int i =0;i<(num-1);i++)
{
head = head->next; //遍历到要插入位置的前一个结点,让head指向该
//结点
}
addnode->data = value; //将传入的数值给新建节点的数字域
addnode->next = head->next; //让新建结点的下一个结点指向原链表中要插入位
//置处的结点
head->next = addnode; //让要插入位置的上一个结点的next指向这个新结
//点
return linklist; //返回这个链表
}
删除单个结点(注意要保存那个要删除的结点,然后还要释放掉这个结点,如果不释放,会一直占内存)
Link delenode(Link linklist,int num) // 第一个参数表示链表,第二个参数表示要删除的是链表中的第
//几个结点
{
Link head = linklist; //定义一个指针,使其指向链表的头结点,用来遍历
Link q; //定义一个指针用来保存要删除的结点
for(int i=0;i<(num-1);i++)
{
head = head->next; //找到要删除的结点的前一个结点
}
q = head->next; //让q指针指向要删除的这个结点
head->next=q->next; //改变前一结点指针的指向,使其指向要删除结点的下一结点
free(q); //删除数据,释放该结点的内存
return linklist; //返回删除后的链表头结点
}
单链表逆序实现
Link revertlink(Link linklist)
{
Link head = linklist; //新建一个指针结点,使该结点指向链表头
Link tail=NULL; //定义一个尾指针
Link node = NULL; //用来指向要逆序的那个结点
Link q = NULL; //用来遍历未逆序的结点
Link reserve = NULL; //定义一个结点,用来指向还未逆序的首结点
tail = head; //让尾指针指向头指针
while(1)
{
reserve = tail->next; //reserve指向还未逆转的链表列
q = tail->next; //该指针用来遍历
//printf("the value of q is %d\n",q->data);
//node = head->next; //需要有一个结点记录尾结点的前一个结点
do
{
if(q->next==NULL) //如果只剩一个结点
{
node = q; //node始终指向要逆序的那个结点,即未逆序链表的尾节点
break;
}
else if(q->next->next==NULL) //如果只剩两个结点
{
node = q->next;
break;
}
else
{
q=q->next;
node = q->next;
}
}while(q->next->next!=NULL); //q指向的是链表的尾结点的前一个结点
q->next = NULL;
if(node == reserve)
{
node->next=NULL;
tail->next = node;
tail = node;
break;
}
else
{
node->next=reserve; //node结点的下一结点指向还未逆序的首结点
tail->next=node; //插入这个尾节点
tail = node; //尾节点指向新插入的结点
// printf("%d,%d\n",tail->data,node->data);
}
}
return linklist;
}
输出打印链表
int printflist(Link linklist)
{
int num=0;
printf("输出链表:\n");
Link array = linklist;
array = array->next;//因为头节点是空的
if(array!=NULL)
{
do
{
printf("%d,%d\n",num,array->data);
num++;
array=array->next;
}while(array!=NULL);
}
return 0;
}
主函数()
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node *next;
}link,*Link;
int main()
{
Link arrayc,arrayd,arraya,arrayda,arrayr;
//返回首地址
arrayc = tcreatelist();
//打印输入的数组
printflist(arrayc);
//arraya = insertnode(arrayc,3,18);
//实现单链表逆序
arrayr = revertlink(arrayc);
//打印逆序结果
printflist(arrayr);
//arrayda = delelist(arraya);
return 0;
}