数据结构双向链表(c语言)
通过c语言实现双向链表的建立、初始化、头插法插入结点、尾插法插入结点、在指定位置添加结点、删除指定位置的结点、查找结点的内容、获取结点的长度、打印输出结点的内容。
#include <stdio.h>
#include <stdlib.h>
typedef struct List
{
//双向链表的结点
struct List *head;
char data;
struct List *next;
}list;
void newList(list * l)
{
//初始化结点
l->head = NULL;
l->next = NULL;
}
void setList(list *l)
{
//建立结点
//循环输入时以‘$’为结束标值
char a;
int i = 1;
printf("请输入数据!\n");
while (i)
{
a = getchar();
if (a == '$')
{
i = 0;
}
else
{
list *l1 = (list *)malloc(sizeof(list));//为新的结点分配内存地址
l1->data = a;//将数据存储
l->next = l1;//将新的结点与链表最后结点链接起来
l1->head = l;//指向新的结点前驱
l1->next = NULL;//新节点的后驱地址为NULL
l = l1;//指针后移,始终指向最后一个结点
}
}
}
void printfList(list *l)
{
//遍历打印链表中的数据
printf("该链表的内容是:\n");
while(l->next)
{
printf("%c\t", l->next->data);
l = l->next;
}
printf("\n");
}
void addHead(list *l, char s)
{
list *l1 = (list *)malloc(sizeof(list));//为新节点分配内存
l1->data = s;//储存数据
/*
将新节点的head区域指向头结点
next区域指向链表的第一个结点
头节点的next区域指向新的结点
*/
l1->next = l->next;
l1->head = l;
l->next = l1;
}
void addEnd(list *l, char s)
{
//遍历链表使得l指向最后一个结点
while (l->next)
{
l = l->next;
}
list *l1 = (list *)malloc(sizeof(list));//为新的结点分配内存
l1->data = s;//存储数据
/*
将最后一个结点的next区域指向新的结点
将新的结点的head区域指向l
将新的结点的next区域指向NULL
*/
l->next = l1;
l1->head = l;
l1->next = NULL;
}
int longList(list *l)
{
int i = 0;
while (l->next)
{
i++;
l = l->next;
}
return i;
}
void addList(list * l, int i, char s)
{
int j = 0;
//在链表的指定位置插入结点(下标值)
if (i >-1 && i < longList(l))
{
while (l->next)
{
j++;
if (j - 1 == i)
{
list *l1 = (list *)malloc(sizeof(list));//为新的结点分配内存
l1->data = s;//储存数据
/*
将插入位置结点的head区域指向新的结点
将新结点的next区域指向插入位置的结点
将新结点的head区域指向插入位置的前一个结点
将插入位置结点的前一个结点的next区域指向新的结点
*/
l->next->head = l1;
l1->next = l->next;
l1->head = l;
l->next = l1;
break;
}
l = l->next;
}
}
else
{
printf("插入位置不合法!\n");
}
}
void deleteList(list *l, int i)
{
int j = 0;
if (i > -1 && i < longList(l))
{
while (l->next)
{
j++;
if (j-1 == i)
{
list *r = l->next;
l->next->next->head = l;
l->next = l->next->next;
free(r);
break;
}
l = l->next;
}
}
else
{
printf("删除位置不合法!\n");
}
}
list * findList(list *l, char s)
{
//遍历链表
while (l->next)
{
if (l->data == s)
{
//当找到结点时返回结点的地址
printf("找到该结点!\n");
return l;
}
else
{
l = l->next;
}
}
if (!(l->next))
{
//若l->next为空时说明没有找到结点,返回0
printf("没有找到该结点!\n");
return 0;
}
}
int main()
{
list * l = (list *)malloc(sizeof(list));
newList(l);//初始化结点
setList(l);//建立链表
int j=longList(l);
printf("该链表的长度为:%d\n", j);
addList(l, 1, 'r');
addHead(l, 's');//头插法插入结点
printfList(l);//打印链表内容
addEnd(l, 's');//尾插法插入结点
deleteList(l,0);
printfList(l);//打印链表内容
system("pause");
return 0;
}