/*DuLinkList.c双链表相关操作*/
#include <stdio.h>
#include <malloc.h>
#define MAXNUM 1024
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *priv;
struct DuLNode *next;
}DuLNode, *DuLinkList;
//创建一个空的双向链表
DuLinkList CreatDuList(void)
{
DuLinkList list=(DuLinkList)malloc(sizeof(DuLNode));
list->next=list->priv=list;
return list;
}
int printDuLink(DuLinkList list)
{
int nodenum=1; //节点序号
DuLinkList p=list->next; //p指向第一个节点
//当无头结点时使用LinkList p=list;
if(p==list)
return -1;
while(p!=list)
{
printf("[%d]:%d/x20 ",nodenum,p->data); //每个节点数据之间用空格隔开
p=p->next;
++nodenum;
}
return 0;
}
/*在第i个位置插入结点1<=i<=表长+1
**Return: 0:成功
** -1:失败 插入位置错误
*/
int DuListInsert(DuLinkList list,int i,ElemType data)
{
DuLinkList pInsert;
DuLinkList p=list; //p指向链表的头结点
int j=1;
if(i<1)
return -1;
//先当找到地i-1个节点
while(j<i) {
p=p->next;
j++;
if(p==list) //到达文件头
return -1; //i大于表长
}
//此时p指向第i-1个节点
pInsert=(DuLinkList)malloc(sizeof(DuLNode)); //pInsert要插入的节点指针
pInsert->data=data;
pInsert->priv=p;
pInsert->next=p->next;
p->next->priv=pInsert->next;
p->next=pInsert;
return 0;
}
/*删除链表中第i个节点
**Return: 0:成功
** -1:失败 删除位置错误
*/
int DuListDelete(DuLinkList list,int i,ElemType *e)
{
int j=1; /* j为计数器 */
DuLinkList p=list->next; /* p指向第一个结点 */
while((p!=list)&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为头结点 */
{
p=p->next;
j++;
}
if((p==list)||i<1) /* 第i个元素不存在 */
return -1;
*e=p->data;
p->priv->next=p->next;
p->next->priv=p->priv;
free(p);
return 0;
}
int main()
{
int num,insertNum,deleteNum;
ElemType insertData,e;
DuLinkList newList;
printf("1.创建一个空的双向链表/n");
printf("2.向链表中插入结点(插入结点的位置>=1且<=表长+1)/n");
printf("3.删除链表中某个节点(要删除的节点的位置>=1且<=表长)/n");
printf("-------------------------/n");
printf("请先创建一个双向链表/n");
while(1)
{
printf("请选择操作:/n");
scanf("%d",&num);
switch(num)
{
case 1:
newList=CreatDuList();
printf("创建空链表成功/n");
break;
case 2:
printf("请输入要插入节点的位置/n");
scanf("%d",&insertNum);
printf("请输入要插入的节点的数据/n");
scanf("%d",&insertData);
if(DuListInsert(newList,insertNum,insertData)==-1)
{
printf("你输入的位置<1或>表长+1/n");
return -1;
}
if(printDuLink(newList))
{printf("链表为空/n");
break;}
case 3:
printf("请输入要删除节点的位置/n");
scanf("%d",&deleteNum);
if(DuListDelete(newList,deleteNum,&e))
{
printf("你输入的位置<1或>表长/n");
return -1;
}
if(printDuLink(newList))
{printf("链表为空/n");
break;
}
default:
printf("输入有误!/n");
}
}
return 0;
}