双向链表基本操作
程序员文章站
2024-03-22 11:24:58
...
//带头节点的双向链表操作
#include <iostream>
#include <cstdio>
#include <cstdlib>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct DuLNode
{
int data;
struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;
void InitList(DuLinkList L)
{ //产生空的双向循环链表L
L = (DuLinkList)malloc(sizeof(DuLNode));
if(L)
L->next = L->prior = L;
else
exit(0);
}
DuLinkList CreateList()
{
int i, length = 0,data;
DuLinkList pTail = NULL, p_new = NULL;
DuLinkList head = (DuLinkList)malloc(sizeof(DuLinkList));
if (NULL == head)
{
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
head->prior = NULL;
head->next = NULL;
pTail = head;
printf("请输入想要创建链表的长度:");
scanf("%d",&length);
for(i=1; i<=length; i++)
{
p_new = (DuLinkList)malloc(sizeof(DuLinkList));
if (NULL == p_new)
{
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
printf("请输入第%d个元素的值:", i);
scanf("%d", &data);
p_new->data = data;
p_new->next = NULL;
p_new->prior = pTail;
pTail->next = p_new;
pTail = p_new;
}
return head;
}
int ListLength(DuLinkList L)
{
int i = 0;
DuLinkList p = L; // p指向第一个结点
while(p->next) //p没到表头
{
i++;
p = p->next;
}
return i;
}
DuLinkList GetElemP(DuLinkList L,int i)
{ /* 在双向链表L中返回第i个元素的地址。i为0,返回头结点的地址。若第i个元素不存在,*/
int j;
DuLinkList p = L; /* p指向头结点 */
if(i<0||i>ListLength(L)) /* i值不合法 */
return NULL;
for(j=1;j<=i;j++)
p = p->next;
return p;
}
Status ListInsert(DuLinkList L,int i,ElemType e)
{
DuLinkList p,s;
if(i<1||i>=ListLength(L)+1) // i值不合法
return ERROR;
p = GetElemP(L,i-1); //在L中确定第i个元素前驱的位置指针p
if(!p) // p=NULL,即第i个元素的前驱不存在(设头结点为第1个元素的前驱)
return ERROR;
s = (DuLinkList)malloc(sizeof(DuLNode));
if(!s)
return OVERFLOW;
s->data = e;
s->prior = p; //先连接前部
s->next = p->next; //连接后部
p->next->prior = s;
p->next = s;
return OK;
}
DuLinkList ListDelete(DuLinkList L,int i)
{
int l = ListLength(L) ; // 删除带头结点的双链循环线性表L的第i个元素,i的合法值为(1<=i<=表长)
DuLinkList p,pp;
if(i<1||i>l){
printf("删除失败-----\n");
exit(0);
}
p = GetElemP(L,i); // 在L中确定第i个元素的位置指针p
if(!p->next){
p->prior->next = NULL;
free(p);
}
else{ //p=NULL,即第i个元素不存在
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
return L;
}
void PrintList(DuLinkList L){
DuLinkList p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
}
int main(){
DuLinkList p,pp;
InitList(p);
p = CreateList();
PrintList(p); //打印原始创建链表
/*测试添加*/
printf("-------\n");
printf("输入你要插入的位置及元素:\n") ;
int weizhi,num;
scanf("%d%d",&weizhi,&num);
int k = ListInsert(p,weizhi,num);
if(k){
PrintList(p);
}
else{
printf("NO!\n");
}
/*测试删除*/
printf("输入你要删除的位置:\n") ;
int weizhi2;
scanf("%d",&weizhi2);
pp = ListDelete(p, weizhi2);
PrintList(pp);
return 0;
}
上一篇: 直接插入排序的严格定义写法与优化算法
下一篇: 数据结构双向带头循环链表