目录
头插法
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; //返回删除后的链表头结点
}
主函数(实现链表的输出打印)
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node *next;
}link,*Link;
int main()
{
int num=0;
Link arrayc,arrayd,arraya,arrayda;
arrayc = tcreatelist();
arrayd = delenode(arrayc,3);
arraya = insertnode(arrayc,3,18);
arrayda = delelist(arraya);
printf("输出链表:\n");
arrayda = arrayda->next; //因为头结点是空的,因此要指向下一结点即首结点打印
if(arrayda!=NULL)
{
do
{
printf("%d,%d\n",num,arrayda->data);
num++;
arrayda=arrayda->next;
}while(arrayda!=NULL);
}
return 0;
}
来源:https://blog.csdn.net/sinat_38205774/article/details/100122991