#include<stdio.h>//头文件
#include<stdlib.h>//头文件 malloc函数
struct node//结点结构体定义
{
struct node* prior;//前指针 指向前一个节点
struct node* next;//后指针 指向后一个节点
int data;
};
typedef struct node node;//为"struct node"起别名node 指结点
typedef struct node linklist;//为"struct node"起别名linklist 指链表
//初始化双向链表
void initialize_list(linklist* plist)
{
// plist = (node*)malloc(sizeof(node));
//此句是错误的!!函数输入参数那里已经为plist分配到了地址!
//如果再分配,之前的地址就丢了,就找不到链表了!
plist->prior = plist;
plist->next = plist;
plist->data = -999;
return;
}
//后插法创建链表
void tail_insert(linklist* plist, int n, int a[])
{
node* tail;
tail = plist;
for(int i=0; i<n; i++)
{
node* point = (node*)malloc(sizeof(node));
point->data = a[i];
point->next = plist;
point->prior = tail;
plist->prior = point;
tail->next = point;
tail = point;
}
return;
}
//在指定位置插入某个元素
void insert_element(linklist* plist, int x, int e)
{
node* tail;
tail = plist;
int i = 0;
while(i != x - 1)
{
tail = tail->next;
i++;
}
node* point = (node*)malloc(sizeof(node));
point->data = e;
tail->next->prior = point;
point->next = tail->next;
point->prior = tail;
tail->next = point;
tail = point;
return;
}
//删除制定位置的元素
void delete_element(linklist* plist, int x)
{
node* tail = plist;
node* p;
int i = 0;
while(i != x - 1)
{
tail = tail->next;
i++;
}
p = tail->next;
tail->next = tail->next->next;
tail->next->prior = tail;
free(p);
return;
}
//后向遍历+计数
int traversal_forth(linklist* plist)
{
node* p = plist;
p = p->next;
int count = 0;
while(p != plist)
{
count++;
p = p->next;
}
return count;
}
//前向遍历+计数
int traversal_back(linklist* plist)
{
node* p = plist;
p = p->prior;
int count = 0;
while(p != plist)
{
count++;
p = p->prior;
}
return count;
}
//打印链表
void print_list(linklist* plist)
{
node* p = plist;
while(p->next != plist)
{
p = p->next;
printf("%d ", p->data);
}
printf("\n");
return;
}
int main()
{
linklist L;//创建
initialize_list(&L);//初始化
printf("how many numbers in this list?\n");
int n;
scanf("%d", &n);
int a[100], b;
printf("please input those numbers:\n");
for(int i=0; i<n; i++)
{
scanf("%d", &b);
a[i] = b;
}
tail_insert(&L, n, a);//输入元素
print_list(&L);//打印链表
insert_element(&L, 4, 999);//在指定位置插入某个元素
printf("after you insert the element:");
print_list(&L);
delete_element(&L, 4);//删除指定位置的元素
printf("after you delete the element:");
print_list(&L);
int count1 = traversal_back(&L);
int count2 = traversal_forth(&L);
printf("后序遍历计数结果:%d \n", count1);
printf("前序遍历计数结果:%d \n", count2);
return 0;
}
双向循环链表的定义以及基本操作 超详细!
最新推荐文章于 2023-07-30 21:45:34 发布