C 程序使用双向链表在任意位置插入节点
cserver side programmingprogramming
链表使用动态内存分配,是节点的集合。
节点有两个部分,即数据和链接。
链表的类型
C 编程语言中的链表类型如下 −
- 单链表。
- 双向链表。
- 循环单链表。
- 循环双向链表。
双向链表
下图描述了双向链表的表示。
示例
以下是 C 程序,用于使用双向链表在任意位置插入节点 −
#include <stdio.h> #include <stdlib.h> struct node { int num; struct node * preptr; struct node * nextptr; }*stnode, *ennode; void DlListcreation(int n); void DlLinsertNodeAtBeginning(int num); void DlLinsertNodeAtEnd(int num); void DlLinsertNodeAtAny(int num, int pos); void displayDlList(int a); int main(){ int n,num1,a,insPlc; stnode = NULL; ennode = NULL; printf("
Doubly Linked List : Insert a node at any position :
"); printf("-----------------------------------------------------------------------------------
"); printf(" Input the number of nodes : "); scanf("%d", &n); DlListcreation(n); a=1; displayDlList(a); printf(" Input the position ( 1 to %d ) to insert a new node : ",n+1); scanf("%d", &insPlc); printf(" Input data for the position %d : ", insPlc); scanf("%d", &num1); DlLinsertNodeAtAny(num1,insPlc); a=2; displayDlList(a); return 0; } void DlListcreation(int n){ int i, num; struct node *fnNode; if(n >= 1){ stnode = (struct node *)malloc(sizeof(struct node)); if(stnode != NULL){ printf(" Input data for node 1 : "); // 在第一个节点分配数据 scanf("%d", &num); stnode->num = num; stnode->preptr = NULL; stnode->nextptr = NULL; ennode = stnode; for(i=2; i<=n; i++){ fnNode = (struct node *)malloc(sizeof(struct node)); if(fnNode != NULL){ printf(" Input data for node %d : ", i); scanf("%d", &num); fnNode->num = num; fnNode->preptr = ennode; fnNode->nextptr = NULL; ennode->nextptr = fnNode; ennode = fnNode; } else{ printf(" Memory can not be allocated."); break; } } } else{ printf(" Memory can not be allocated."); } } } void DlLinsertNodeAtAny(int num, int pos){ int i; struct node * newnode, *tmp; if(ennode == NULL){ printf(" No data found in the list!
"); } else{ tmp = stnode; i=1; while(i<pos-1 && tmp!=NULL){ tmp = tmp->nextptr; i++; } if(pos == 1){ DlLinsertNodeAtBeginning(num); } else if(tmp == ennode){ DlLinsertNodeAtEnd(num); } else if(tmp!=NULL){ newnode = (struct node *)malloc(sizeof(struct node)); newnode->num = num; newnode->nextptr = tmp->nextptr; newnode->preptr = tmp; if(tmp->nextptr != NULL){ tmp->nextptr->preptr = newnode; // 第 n+1 个节点与新节点链接 } tmp->nextptr = newnode; // 第 n-1 个节点与新节点链接 } else{ printf(" The position you entered, is invalid.
"); } } } void DlLinsertNodeAtBeginning(int num){ struct node * newnode; if(stnode == NULL){ printf(" No data found in the list!
"); } else{ newnode = (struct node *)malloc(sizeof(struct node)); newnode->num = num; newnode->nextptr = stnode; newnode->preptr = NULL; stnode->preptr = newnode; stnode = newnode; } } void DlLinsertNodeAtEnd(int num){ struct node * newnode; if(ennode == NULL){ printf(" No data found in the list!
"); } else{ newnode = (struct node *)malloc(sizeof(struct node)); newnode->num = num; newnode->nextptr = NULL; newnode->preptr = ennode; ennode->nextptr = newnode; ennode = newnode; } } void displayDlList(int m){ struct node * tmp; int n = 1; if(stnode == NULL) { printf(" No data found in the List yet."); } else{ tmp = stnode; if (m==1) { printf("
Data entered in the list are :
"); } else{ printf("
After insertion the new list are :
"); } while(tmp != NULL){ printf(" node %d : %d
", n, tmp->num); n++; tmp = tmp->nextptr; // current pointer moves to the next node } } }
输出
当执行上述程序时,它会产生以下结果 −
Doubly Linked List : Insert node at any position: ----------------------------------------------------------------------------------- Input the number of nodes : 5 Input data for node 1 : 23 Input data for node 2 : 12 Input data for node 3 : 11 Input data for node 4 : 34 Input data for node 5 : 10 Data entered in the list are : node 1 : 23 node 2 : 12 node 3 : 11 node 4 : 34 node 5 : 10 Input the position ( 1 to 6 ) to insert a new node : 5 Input data for the position 5 : 78 After insertion the new list are : node 1 : 23 node 2 : 12 node 3 : 11 node 4 : 34 node 5 : 78 node 6 : 10