#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node *pre;//前驱
struct node *next;//后继
}Node,*Linklist;
void InitList(Linklist l)//置空头结点
{
if(l == NULL)
return ;
l->next=NULL;
l->pre=NULL;
}
Node* BuyNode(int e)
{
Node* s=(Node*)malloc(sizeof(Node));
s->data=e;
s->next=NULL;
s->pre=NULL;
return s;
}
int ShowList(Linklist l)
{
Node* p=l->next;
while(p != NULL)
{
printf("%3d",p->data);
p=p->next;
}
printf("\n");
return 0;
}
void InsertHead(Linklist l,int e)//向空头结点向后表添加元素
{
Node* s=BuyNode(e);
s->next=l->next;
s->pre=l;
if(s->next != NULL)
{
s->next->pre=s;
}
l->next=s;
}
void InsertTail(Linklist l,int e)//向空表的末尾添加元素
{
Node* s=BuyNode(e);
Node* p=l;
while(p->next != NULL)
{
p=p->next;
}
s->pre=p;
p->next=s;
}
int Delete(Linklist l,int key)//按值查找然后删除
{
Node* p=l;
Node* s=l->next;
while(s != NULL)
{
if(s->data == key)
{
if(s->next != NULL)
{
s->next->pre=s->pre;
}
s->pre->next=s->next;
return 1;
}
else
{
p=s;
s=s->next;
}
}
return 0;
}
Node* Search(Linklist l,int key)//查找指定的值
{
Node* s=l->next;
while(s != NULL)
{
if(s->data == key)
{
return s;
}
s=s->next;
}
return NULL;
}
int GetLinklist(Linklist l)//计算链表长度
{
Node* s=l->next;
int sum=0;
while(s != NULL)
{
s=s->next;
++sum;
}
return sum;
}
void Destroy(Linklist l)//摧毁链表 释放空间
{
Node* s=l->next;
while(s != NULL)
{
l=s->next;
free(s);
s=l;
}
}
int main()
{
Node head;
Node* pTmp;
int i,j;
InitList(&head);
for(i=1;i<5;++i)
{
InsertTail(&head,i);
}
ShowList(&head);
printf("Linklist length is %d\n",GetLinklist(&head));//计算链表长度!
for(j=6;j<10;j++)
{
InsertTail(&head,j);
}
ShowList(&head);
printf("Linklist length is %d\n",GetLinklist(&head));
printf("找到的结点为:");
pTmp=Search(&head,4);
printf("%d\n",pTmp->data);
printf("删除第一个结点!");
if(Delete(&head,4))
{
ShowList(&head);
}
else
{
printf("Not Found!!");
}
printf("删除最后一个结点!");
if(Delete(&head,9))
{
ShowList(&head);
}
else
{
printf("Not Found!!");
}
Destroy(&head);
return 0;
}
/*#include<stdio.h>
#include<stdlib.h>
typedef struct _DNode
{
int data;
struct _DNode* pre; //前驱指针
struct _DNode* next; //后继指针
}DNode, *DList;
void InitList(DList plist);
void InsertHead(DList plist, int val);
void InsertTail(DList plist, int val);
int Delete(DList plist, int key);
DNode* Search(DList plist, int key);
int GetListLen(DList plist);
void Destroy(DList plist);
DNode* BuyNode(int val);
void ShowDList(DList plist);
int main()
{
DNode head;
DNode* pTmp;
int i,j;
InitList(&head);
for (i = 1; i < 5; ++i)
{
InsertHead(&head, i);
}
ShowDList(&head);
printf("DList length is %d \n", GetListLen(&head));
for (j = 6; j < 10; ++j)
{
InsertTail(&head, j);
}
ShowDList(&head);
printf("DList length is %d \n", GetListLen(&head));
printf("search 第一个节点4:");
pTmp = Search(&head, 4);
printf("%d\n", pTmp->data);
printf("search 最后一个节点9:");
pTmp = Search(&head, 9);
printf("%d\n", pTmp->data);
printf("删除第一个节点4:\n");
if (Delete(&head, 4))
{
ShowDList(&head);
}
else
{
printf("Not Fount!!!\n");
}
printf("删除最后一个节点9:\n");
if (Delete(&head, 9))
{
ShowDList(&head);
}
else
{
printf("Not Fount!!!\n");
}
Destroy(&head); //销毁链表
return 0;
}
void InitList(DList plist) //初始化头结点
{
if (NULL == plist)
return;
plist->next = NULL;
plist->pre = NULL;
}
DNode* BuyNode(int val)
{
DNode* pTmp = (DNode*)malloc(sizeof(DNode));
pTmp->data = val;
pTmp->next = NULL;
pTmp->pre = NULL;
return pTmp;
}
void ShowDList(DList plist)
{
DNode* pCur = plist->next;
while (NULL != pCur)
{
printf("%5d", pCur->data);
pCur = pCur->next;
}
printf("\n");
}
void InsertHead(DList plist, int val)
{
DNode* pTmp = BuyNode(val); //申请一个新的节点
pTmp->next = plist->next;
pTmp->pre = plist;
if (NULL != pTmp->next) //这里的判断一定不能少,读者可以试想去掉这个会发生什么
{
pTmp->next->pre = pTmp; //后一个节点的前驱指向pTmp
}
plist->next = pTmp;
}
void InsertTail(DList plist, int val)
{
DNode* pTmp = BuyNode(val);
DNode* pCur = plist;
while (NULL != pCur->next)
{
pCur = pCur->next;
}
pTmp->pre = pCur;
pCur->next = pTmp;
}
int Delete(DList plist, int key)
{
DNode* pPre = plist; //前驱结点
DNode* pCur = plist->next; //后继节点
while (NULL != pCur)
{
if (pCur->data == key)
{
if (NULL != pCur->next) //这涉及到删除最后一个节点,因为对于最后一个节点来说pCur->next为空,也即pCur->next没有pre
{
pCur->next->pre = pCur->pre;
}
pCur->pre->next = pCur->next;
return 1;
}
else
{
pPre = pCur;
pCur = pCur->next;
}
}
return 0;
}
DNode* Search(DList plist, int key)
{
DNode* pCur = plist->next;
while (NULL != pCur)
{
if (pCur->data == key)
{
return pCur;
}
pCur = pCur->next;
}
return NULL;
}
int GetListLen(DList plist)
{
DNode* pTmp = plist->next;
int iCount = 0;
while (NULL != pTmp)
{
++iCount;
pTmp = pTmp->next;
}
return iCount;
}
void Destroy(DList plist)
{
DNode* pTmp = plist->next;
while (NULL != pTmp)
{
plist = pTmp->next;
free(pTmp);
pTmp = plist;
}
} */
双向链表
最新推荐文章于 2023-12-20 13:35:53 发布