1、单链表:线性链表
插入:根据插入的位置,分3种,第一个结点前,最后一个结点后,插入在中间
删除:也同样分为3种,删除第一个结点,删除最后一个结点,删除中间的结点
#include <iostream>
using namespace std;
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode;
//链表的创建
LinkNode * CreateLink()
{
int i;
LinkNode *head,*ptr,*p;
head = (LinkNode*)malloc(sizeof(LinkNode)); //分配内存
if(!head)
{
printf("内存分配失败。");
exit(1);
}
printf("请输入第1个数据:");
scanf("%d",&head->data);
head->next = NULL;
ptr = head;
for(i=1;i<5;i++)
{
p = (LinkNode*)malloc(sizeof(LinkNode));
if(!p)
{
printf("内存分配失败!\n");
exit(1);
}
printf("请输入第%d个数据:",i+1);
scanf("%d",&p->data);
p->next = NULL;
ptr->next = p;
ptr = ptr->next;
}
return head;
}
//查找链表结点
LinkNode *FindNode(LinkNode *head,int num)
{
LinkNode *ptr;
ptr = head;
while(ptr)
{
if(ptr->data == num)
return ptr;
ptr = ptr->next;
}
return ptr;
}
//链表结点的插入
LinkNode *InsertNode(LinkNode *head,LinkNode *ptr,int value)
{
LinkNode *newnode = (LinkNode *)malloc(sizeof(LinkNode));
if(!newnode) exit(1);
newnode->data = value;
newnode->next = NULL;
if(ptr == NULL) //插入在表头
{
newnode->next = head;
return newnode;
}
else
{
if(ptr->next == NULL) ptr->next = newnode;//插入在表尾
else //插入在表中
{
newnode->next = ptr->next;
ptr->next = newnode;
}
}
return head;
}
//链表结点删除
LinkNode * DeleteNode(LinkNode *head,LinkNode *ptr)
{
LinkNode *pre; //指向前一结点
if(ptr==head) //要删除的结点是头结点
return head->next; //输出第二个结点的指针
else
{
pre = head;
while(pre->next!=ptr) //找要删除结点的前一个结点
{
pre = pre->next;
}
if(ptr->next==NULL) //要删除的结点是最后一个结点
pre->next = NULL;
else
pre->next = ptr->next;
}
free(ptr);//释放结点内存
return head;
}
//链表输出
void PrintNode(LinkNode *ptr)
{
while(ptr!=NULL)
{
printf("%d\t",ptr->data); //输出结点数据
ptr = ptr->next;
}
printf("\n");
}
//链表的内存释放
void FreeLinkNode(LinkNode *head)
{
LinkNode *ptr;
while(head!=NULL)
{
ptr = head;
head = head->next;
free(ptr);
}
}
void main()
{
int num,value;
LinkNode *head,*ptr; //指向链表开始
head = CreateLink(); //创建链表
PrintNode(head); //输出链表
printf("请输入要查找的数据:\n");
scanf("%d",&num);
ptr = FindNode(head,num);
if(!ptr)
printf("没有找到\n");
else
{
printf("找到啦!\n请输入要插入的数据:\n");
scanf("%d",&value);
head = InsertNode(head,ptr,value);
PrintNode(head); //输出链表
}
printf("请输入要查找并删除的数据:\n");
scanf("%d",&num);
ptr = FindNode(head,num);
if(!ptr)
printf("没有找到\n");
else
{
printf("找到啦!\n");
head = DeleteNode(head,ptr);
PrintNode(head);
}
FreeLinkNode(head);
system("pause");
}
结果输出: