链表是一种线性数据结构,由两部分组成:一是数据部分,二是地址部分。一个双向链表包含三个部分:一个是数据部分,另外两个是列表中下一个和上一个节点的地址。在本文中,在一个菜单驱动程序中讨论了双向链表的所有常见操作。
要执行的操作:
- traverse():要查看链表的内容,需要遍历给定的双向链表。给定的 traverse()函数遍历并打印双向链表的内容。
- insertAtFront():这个函数只是在双向链表的前面/开头插入一个元素。
- insertAtEnd():该函数在双向链表的末尾插入一个元素。
- insertAtPosition():该函数在双向链表的指定位置插入一个元素。
- deleteFirst():这个函数只是从双向链表的前面/开头删除一个元素。
- deleteEnd():这个函数只是从双向链表的末尾删除一个元素。
- deletePosition():该函数从双向链表中的指定位置删除一个元素。
下面是上述操作的实现:
C
// C program for the all operations in
// the Doubly Linked List
#include
#include
// Linked List Node
struct node {
int info;
struct node *prev, *next;
};
struct node* start = NULL;
// Function to traverse the linked list
void traverse()
{
// List is empty
if (start == NULL)
printf("\nList is empty\n");
struct node* temp;
// Else print the DLL
else
{
temp = start;
while (temp != NULL) {
printf("Data = %d\n",
temp->info);
temp = temp->next;
}
}
}
// Function to insert at the front
// of the linked list
void insertAtFront()
{
int data;
struct node* temp;
temp = (struct node*)malloc(
sizeof(struct node));
printf("\nEnter number to be inserted: ");
scanf("%d", &data);
temp->info = data;
temp->prev = NULL;
// Pointer of temp will be
// assigned to start
temp->next = start;
start = temp;
}
// Function to insert at the end of
// the linked list
void insertAtEnd()
{
int data;
struct node *temp, *trav;
temp = (struct node*)malloc(
sizeof(struct node));
temp->prev = NULL;
temp->next = NULL;
printf("\nEnter number to be inserted: ");
scanf("%d", &data);
temp->info = data;
temp->next = NULL;
trav = start;
// If start is NULL
if (start == NULL) {
start = temp;
}
// Changes Links
else {
while (trav->next != NULL)
trav = trav->next;
temp->prev = trav;
trav->next = temp;
}
}
// Function to insert at any specified
// position in the linked list
void insertAtPosition()
{
int data, pos, i = 1;
struct node *temp, *newnode;
newnode = malloc(sizeof(struct node));
newnode->next = NULL;
newnode->prev = NULL;
// Enter the position and data
printf("\nEnter position : ");
scanf("%d", &pos);
printf("\nEnter number to be inserted: ");
scanf("%d", &data);
newnode->info = data;
temp = start;
// If start==NULL,
if (start == NULL) {
start = newnode;
newnode->prev = NULL;
newnode->next = NULL;
}
// If position==1,
else if (pos == 1) {
newnode->next = start;
newnode->next->prev = newnode;
newnode->prev = NULL;
start = newnode;
}
// Change links
else {
while (i < pos - 1) {
temp = temp->next;
i++;
}
newnode->next = temp->next;
newnode->prev = temp;
temp->next = newnode;
temp->next->prev = newnode;
}
}
// Function to delete from the front
// of the linked list
void deleteFirst()
{
struct node* temp;
if (start == NULL)
printf("\nList is empty\n");
else {
temp = start;
start = start->next;
if (start != NULL)
start->prev = NULL;
free(temp);
}
}
// Function to delete from the end
// of the linked list
void deleteEnd()
{
struct node* temp;
if (start == NULL)
printf("\nList is empty\n");
temp = start;
while (temp->next != NULL)
temp = temp->next;
if (start->next == NULL)
start = NULL;
else {
temp->prev->next = NULL;
free(temp);
}
}
// Function to delete from any specified
// position from the linked list
void deletePosition()
{
int pos, i = 1;
struct node *temp, *position;
temp = start;
// If DLL is empty
if (start == NULL)
printf("\nList is empty\n");
// Otherwise
else {
// Position to be deleted
printf("\nEnter position : ");
scanf("%d", &pos);
// If the position is the first node
if (pos == 1) {
position = start;
start = start->next;
if (start != NULL) {
start->prev = NULL;
}
free(position);
return;
}
// Traverse till position
while (i < pos - 1) {
temp = temp->next;
i++;
}
// Change Links
position = temp->next;
if (position->next != NULL)
position->next->prev = temp;
temp->next = position->next;
// Free memory
free(position);
}
}
// Driver Code
int main()
{
int choice;
while (1) {
printf("\n\t1 To see list\n");
printf("\t2 For insertion at"
" starting\n");
printf("\t3 For insertion at"
" end\n");
printf("\t4 For insertion at "
"any position\n");
printf("\t5 For deletion of "
"first element\n");
printf("\t6 For deletion of "
"last element\n");
printf("\t7 For deletion of "
"element at any position\n");
printf("\t8 To exit\n");
printf("\nEnter Choice :\n");
scanf("%d", &choice);
switch (choice) {
case 1:
traverse();
break;
case 2:
insertAtFront();
break;
case 3:
insertAtEnd();
break;
case 4:
insertAtPosition();
break;
case 5:
deleteFirst();
break;
case 6:
deleteEnd();
break;
case 7:
deletePosition();
break;
case 8:
exit(1);
break;
default:
printf("Incorrect Choice\n");
}
}
return 0;
}
输出:
菜单:
开头插入:
最后插入:
在特定位置插入:
打印链表:
使用选项 5 和 6 删除第一个和最后一个元素:
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live