标签:Node head temp printf next 链表 循环 双向
文章目录
要求
实现双向循环链表,实现插入、删除、查询等操作,生成成静态库和动态库,编写测试程序验证库文件,编写makefile实现编译。函数包括以下:
a、链表初始化
b、两个链表合并
c、链表节点个数
d、删除指定节点
e、指定节点后插入新的节点(尾插)
f、找出指定节点在链表中位置
g、销毁链表
一、双向循环链表介绍
参考文章:
(C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
详解双向链表的基本操作(C语言)
数据结构-双向链表(初始化、插入、删除等基本操作)
数据结构——双向循环链表的结构与实现(C语言)
二、双向循环链表实现
1. BCLinkList.h
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *prior;
struct Node *next;
}Node;
Node *initLinkList(Node *head,int length);
void printLinkList(Node *head);
int nodeNumLinkList(Node *head);
Node *cmbLinkList(Node *head1,Node *head2);
Node *deleteNode(Node *head,int data);
Node *insertLinkNode(Node *head,int num,int data);
int findNode(Node *head,int data);
void destroyLinkList(Node *head);
2. initLinkList.c
#include "BCLinkList.h"
#define MAX 100
Node* creatNode(Node *head);
/*生成新的结点*/
Node* creatNode(Node *node)
{
node = (Node*)malloc(sizeof(Node));
if(NULL == node)
{
printf("malloc error\n");
exit(-1);
}
node->prior = NULL;
node->next = NULL;
node->data = rand()%MAX;
return node;
}
/*创建链表,链表元素个数可设置*/
Node* initLinkList(Node *head,int length)
{
Node *pNew = NULL;
Node *temp = NULL;
head = creatNode(head);
head->next = head->prior = head;
/*只有一个元素*/
if(length == 1)
{
return head;
}else
{
temp = head;
length--;
while(length--)
{
pNew = creatNode(pNew);
pNew->prior = temp;
temp->next = pNew;
pNew->next = head;
head->prior = pNew;
temp = pNew;
}
return head;
}
}
3. printLinkList.c
#include "BCLinkList.h"
void printLinkList(Node *head)
{
Node *temp = head;
if(NULL == head)
{
printf("链表为空\n");
exit(-1);
}
printf("链表元素:");
while(temp->next != head)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("%d",temp->data);
printf("\n");
}
4. nodeNumLinkList.c
#include "BCLinkList.h"
int nodeNumLinkList(Node* head)
{
int nodeNum = 0;
Node *temp = head->next;
if(NULL == head)
{
printf("链表为空,无节点\n");
exit(-1);
}
while(temp != head)
{
temp = temp->next;
nodeNum++;
}
return nodeNum+1;
}
5. cmbLinkList.c
#include "BCLinkList.h"
Node *cmbLinkList(Node *head1,Node *head2)
{
Node *ahead = head1;
Node *bhead = head2;
Node *tail1 = head1; //后面遍历得到尾节点
Node *tail2 = head2; //后面遍历得到尾节点
if((NULL == head1)||(NULL == head2))
{
printf("有链表为空!\n");
exit(-1);
}
/*将两个链表进行遍历,获得尾节点,这样就分别得到了两个链表的
*头节点和尾节点,后面就好办了*/
while(tail1->next != head1)
{
tail1 = tail1->next;
}
while(tail2->next != head2)
{
tail2 = tail2->next;
}
tail2->next = ahead;
ahead->prior = tail2;
tail1->next = bhead;
bhead->prior = tail1;
return ahead;
}
6. deleteNode.c
#include "BCLinkList.h"
Node *deleteNode(Node *head,int data)
{
Node *temp = head;
if(NULL == head)
{
printf("空链表!\n");
}
while(temp->next != head)
{
if(temp->data == data)
{
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free(temp);
}
temp = temp->next;
}
return head;
}
7. insertLinkNode.c
#include "BCLinkList.h"
Node* insertLinkNode(Node *head,int num,int data)
{
Node *temp = head;
Node *pNew = NULL;
pNew = (Node*)malloc(sizeof(Node));
pNew->prior = NULL;
pNew->next = NULL;
pNew->data = data; //创建新节点
if(NULL == head)
{
printf("空链表!\n");
exit(-1);
}
while(temp->next != head)
{
if(temp->data == num)
{
pNew->next = temp->next;
pNew->prior = temp;
temp->next->prior = pNew;
temp->next = pNew;
}
temp = temp->next;
}
return head;
}
8. findNode.c
#include "BCLinkList.h"
int findNode(Node *head,int data)
{
int pos = 0;
Node *temp = head;
if(NULL == head)
{
printf("空链表!\n");
}
while((temp->next != head) && (temp->data != data))
{
temp = temp->next;
pos++;
}
return pos+1;
}
9. destroyLinkList.c
#include "BCLinkList.h"
void destroyLinkList(Node *head)
{
Node *temp = NULL;
Node *pre = NULL;
temp = head->next;
while(temp != head)
{
pre = temp;
temp = temp->next;
free(pre);
}
free(head);
printf("链表已销毁!\n");
}
10. main.c
#include "BCLinkList.h"
int main()
{
Node *head1 = NULL;
Node *head2 = NULL;
head1 = (Node*)malloc(sizeof(Node));
head2 = (Node*)malloc(sizeof(Node));
int nodeNum = 0;
int pos = 0;
/*初始化链表1*/
head1 = initLinkList(head1,10);
if(NULL == head1)
{
printf("初始化失败!\n");
exit(-1);
}
printf("初始化链表1:\n");
printLinkList(head1);
printf("表头后:%d\n",(head1->next->data));
printf("表头前:%d\n",(head1->prior->data));
printf("\n");
/*初始化链表2*/
head2 = initLinkList(head2,8);
if(NULL == head2)
{
printf("初始化失败!\n");
exit(-1);
}
printf("初始化链表2:\n");
printLinkList(head2);
printf("表头后:%d\n",(head2->next->data));
printf("表头前:%d\n",(head2->prior->data));
printf("\n");
/*合并链表1和链表2,生成新链表*/
head1 = cmbLinkList(head1,head2);
printf("合并后的链表:\n");
printLinkList(head1);
printf("\n");
/*链表节点个数*/
nodeNum = nodeNumLinkList(head1);
printf("链表的节点个数为:%d\n",nodeNum);
printf("\n");
/*删除指定节点*/
head1 = deleteNode(head1,90);
printf("删除节点90:\n");
printLinkList(head1);
nodeNum = nodeNumLinkList(head1);
printf("链表的节点个数为:%d\n",nodeNum);
printf("\n");
/*指定节点后插入新节点*/
head1 = insertLinkNode(head1,93,1000);
printf("在节点93后插入节点1000:\n");
printLinkList(head1);
nodeNum = nodeNumLinkList(head1);
printf("链表的节点个数为:%d\n",nodeNum);
printf("\n");
/*找出指定节点在链表中的位置*/
pos = findNode(head1,62);
printf("节点62在第%d位\n",pos);
printf("\n");
/*销毁链表*/
destroyLinkList(head1);
printf("\n");
return 0;
}
11. Makefile
#main: main.c libcmbLinkList.a libdeleteNode.a libdestroyLinkList.a libfindNode.a libinitLinkList.a libinsertLinkNode.a libnodeNumLinkList.a libprintLinkList.a
# gcc -o main main.c -L . -lcmbLinkList -ldeleteNode -ldestroyLinkList -lfindNode -linitLinkList -linsertLinkNode -lnodeNumLinkList -lprintLinkList
#libcmbLinkList.a:
# gcc -c cmbLinkList.c -o cmbLinkList.o
# ar rcs libcmbLinkList.a cmbLinkList.o
#libdeleteNode.a:
# gcc -c deleteNode.c -o deleteNode.o
# ar rcs libdeleteNode.a deleteNode.o
#libdestroyLinkList.a:
# gcc -c destroyLinkList.c -o destroyLinkList.o
# ar rcs libdestroyLinkList.a destroyLinkList.o
#libfindNode.a:
# gcc -c findNode.c -o findNode.o
# ar rcs libfindNode.a findNode.o
#libinitLinkList.a:
# gcc -c initLinkList.c -o initLinkList.o
# ar rcs libinitLinkList.a initLinkList.o
#libinsertLinkNode.a:
# gcc -c insertLinkNode.c -o insertLinkNode.o
# ar rcs libinsertLinkNode.a insertLinkNode.o
#libnodeNumLinkList.a:
# gcc -c nodeNumLinkList.c -o nodeNumLinkList.o
# ar rcs libnodeNumLinkList.a nodeNumLinkList.o
#libprintLinkList.a:
# gcc -c printLinkList.c -o printLinkList.o
# ar rcs libprintLinkList.a printLinkList.o
#clean:
# rm *.o
# rm main
# rm *.a
#
main: main.c libcmbLinkList.so libdeleteNode.so libdestroyLinkList.so libfindNode.so libinitLinkList.so libinsertLinkNode.so libnodeNumLinkList.so libprintLinkList.so
gcc -o main main.c -L . -lcmbLinkList -ldeleteNode -ldestroyLinkList -lfindNode -linitLinkList -linsertLinkNode -lnodeNumLinkList -lprintLinkList
libcmbLinkList.so:
gcc -fPIC -shared cmbLinkList.c -o libcmbLinkList.so
libdeleteNode.so:
gcc -fPIC -shared deleteNode.c -o libdeleteNode.so
libdestroyLinkList.so:
gcc -fPIC -shared destroyLinkList.c -o libdestroyLinkList.so
libfindNode.so:
gcc -fPIC -shared findNode.c -o libfindNode.so
libinitLinkList.so:
gcc -fPIC -shared initLinkList.c -o libinitLinkList.so
libinsertLinkNode.so:
gcc -fPIC -shared insertLinkNode.c -o libinsertLinkNode.so
libnodeNumLinkList.so:
gcc -fPIC -shared nodeNumLinkList.c -o libnodeNumLinkList.so
libprintLinkList.so:
gcc -fPIC -shared printLinkList.c -o libprintLinkList.so
clean:
rm main
rm *.so
标签:Node,head,temp,printf,next,链表,循环,双向 来源: https://blog.csdn.net/little_rookie__/article/details/121502920
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。