单链表 要求:
1)建立一张单链表,数据为11,12,13,14,15 ;
2)打印单链表中的数据
3)查找第3个数据结点的数据并打印
4)在第5个数据结点后插入数据为16的结点,并打印单链表中的数据
5)删除第1个数据结点,并打印单链表中的数据
双链表 要求:
1)建立一张双向链表,数据为1,2,3,4,5 ;
2)打印双向链表中的数据
3)查找第3个数据结点的数据并打印
4)在第5个数据结点后插入数据为6的结点,并打印链表中的数据
5)删除第1个数据结点,并打印链表中的数据
/*
双链表的基础操作
要求:1)建立一张单链表,数据为1,2,3,4,5 ;
2)打印单链表中的数据
3)查找第3个数据结点的数据并打印
4)在第5个数据结点后插入数据为6的结点,并打印单链表中的数据
5)删除第1个数据结点,并打印单链表中的数据
*/
#include<stdio.h>
#include<malloc.h>
//双链表结构体类型
typedef struct Node{
int data;
struct Node *next;
struct Node *prior;
} LinkList;
//1.双链表建立,包含n个数据结点——1)头插法
LinkList *CreatList_H(int n)
{
//1、创建头指针head,将其next置为NULL
LinkList *head,*s;
head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
//4、反复执行2、3,完成若干结点的插入。
int i;
for( i=1;i<=n;i++)
{
//2、生成新结点,s指向它
s = (LinkList*)malloc(sizeof(LinkList));
scanf("%d",&s->data);
//3、头结点后插入新结点。
s->next = head->next;
head->next= s;
}
return head;
}
//1.双链表建立,包含n个数据结点——2)尾插法
LinkList * CreatList_T(int n)
{
//1、创建头结点,并设为尾结点p。
LinkList *head,*p,*s;
head = (LinkList*)malloc(sizeof(LinkList));
p=head;
//5、反复执行2 3 4,完成若干结点的插入,将尾结点next置为NULL。
int i;
for( i=1;i<=n;i++)
{
//2、生成新结点,s指向它。
s = (LinkList*)malloc(sizeof(LinkList));
scanf("%d",&s->data);
//3、尾结点去链接新结点。
s->prior=p;
p->next=s;
//4、新结点设置成尾结点。
p=s;
}
p->next=head->prior=NULL;
return head;
}
//2.打印 head所指向的单链表中的元素
void Display(LinkList *head)
{
LinkList *p=head->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//3.查找--1)按序号查找
LinkList *FindKth( int K, LinkList *head )
{
if(K<1) return NULL;
LinkList *p=head->next;
int i=1;
while(p!=NULL&&i<K)
{
p=p->next;
i++;
}
if(i==K) return p;
else return NULL;
}
//3.查找--2)按值查找
LinkList *Find( int X, LinkList *head)
{
LinkList *p=head->next;
while(p!=NULL&&p->data!=X)
{
p=p->next;
}
return p;
}
//4.在链表的第 i-1(1≤i≤n+1)个数据结点后插入一个值为X的新结点(即在插入新结点为第i个数据结点)
LinkList *Insert( int X, int i, LinkList *head )
{
LinkList *p,*s;
if(i<1) return NULL;
//1、先找第 i-1个结点,若不存在返回NULL,若存在用p指向;
p=head;
int j=0;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL) return NULL;
//2、再构造一个新结点,用s指向;
s = (LinkList*)malloc(sizeof(LinkList));
s->data=X;
//3、修改指针,插入结点 (s的下一个结点是p的下一个, p的下一个结点是插入新结点 s)
s->next = p->next;
s->prior = p;
if(p->next!=NULL){
p->next->prior=s;
}
p->next = s;
return head;
}
//4.删除链表的第 i (1≤i≤n)个位置上的数据结点
LinkList *Delete( int i, LinkList *head )
{
LinkList *p,*s;
if(i<1) return NULL;
//1、先找第 i-1个结点,若不存在返回NULL,若存在用p指向;
p=head;
int j=0;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL) return NULL;
//2、再找第i个结点,若不存在返回NULL,若存在用s指向要被删除的结点;
s=p->next;
if(s==NULL) return NULL;
//3、然后修改指针,删除s所指结点;( p的下一个结点变成s的下一个结点)
p->next=s->next;
//4、释放s所指结点的空间。
if(s->next!=NULL){
s->next->prior=p;
}
free(s);
return head;
}
//1 2 3 4 5
int main()
{
//LinkList *L=CreatList_H(5);
LinkList *L=CreatList_T(5);
printf("初始链表的数据为:\n");
Display(L);
LinkList *d3=FindKth( 3, L);
printf("第3个数据结点数据值为:%d\n",d3->data);
L=Insert( 6, 6, L);
printf("插入6后链表的数据为:\n");
Display(L);
Delete(1, L);
printf("删除第一个结点后链表的数据为:\n");
Display(L);
}