带头结点循环双向链表 c语言实现
程序员文章站
2024-03-22 11:03:22
...
博主尝试用头插法实现动态链表的创建,不知道为什么在输出整个链表的结点数据。最后链表总是越界,输出p->data的地址。
//链表抽象数据结构
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLink;
//头插法创建双向链表
void CreateDuLink(DuLink *L,int n){
*L=(DuLNode*)malloc(sizeof(DuLNode));
(*L)->prior=(*L)->next=L;//头结点的前驱
//和后继都指向自己
int i=0;
DuLink p;
for(;i<n;i++){
p=(DuLNode*)malloc(sizeof(DuLNode));
printf("请输入数据:");
scanf("%d",&p->data);
// p->data=i;
//不知道是这里哪错了,找了好久,感觉没哪错
p->next=(*L)->next;
p->prior=(*L);
(*L)->next->prior=p;//(*L)->next->prior=p;
(*L)->next=p;//
/**
p->next=(*L)->next;
p->next->prior=p;
(*L)->next=p;
p->prior=*L;
*/
}
}
//输出链表所有结点的数据
void printElemt(DuLink L){
DuLink p=NULL;
p=L->next;
while(p!=L){//尾插入创建的链表输出没问题,头插入创建的总越界
printf("%d\n",p->data);
p=p->next;
}
}
附上整个程序代码
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLink;
//头插法创建双向链表
void CreateDuLink(DuLink *L,int n){
*L=(DuLNode*)malloc(sizeof(DuLNode));
(*L)->prior=(*L)->next=L;//头结点的前驱
//和后继都指向自己
int i=0;
DuLink p;
for(;i<n;i++){
p=(DuLNode*)malloc(sizeof(DuLNode));
printf("请输入数据:");
scanf("%d",&p->data);
// p->data=i;
p->next=(*L)->next;
p->prior=(*L);
(*L)->next->prior=p;//(*L)->next->prior=p;
(*L)->next=p;//
/**
p->next=(*L)->next;
p->next->prior=p;
(*L)->next=p;
p->prior=*L;
*/
}
}
//尾插法创建双向链表
void Cre*Link(DuLink *L,int n){
*L=(DuLNode*)malloc(sizeof(DuLNode));
(*L)->prior=L;//头结点的前驱
(*L)->next=L;//和后继都指向自己
int i=0;
DuLink p,q;
q=(*L);
for(;i<n;i++){
p=(DuLNode*)malloc(sizeof(DuLNode));
printf("请输入数据:");
scanf("%d",&p->data);
// p->data=i;
q->next=p;
p->prior=q;
q=p;
}
(*L)->prior=p;//将头结点的前驱指向最后一个结点
p->next=(*L);//将最后一个结点的后继指向头结点
}
//输出链表所有结点的数据
void printElemt(DuLink L){
DuLink p=NULL;
p=L->next;
while(p!=L){
printf("%d\n",p->data);
p=p->next;
}
}
//在第i个结点前插入新的结点
void InsertNode(DuLink *L, int i ){
DuLink p=(*L)->next;
int j=1;
while(j<i-1&&p->next!=*L){//找到第i-1个结点
j=j++;
p=p->next;
}
if(j!=i-1){
printf("输入的结点数过大\n");
}else{
DuLink q=(DuLNode*)malloc(sizeof(DuLNode));
printf("输入要插入的数");
scanf("%d",&q->data);
p->next->prior=q;//顺序
q->next=p->next;//不可
q->prior=p;//随意
p->next=q;//交换
printf("插入成功\n");
}
}
//删除第i个结点,并返回该结点数据
int DelNode(DuLink *L, int i){
DuLink p=(*L)->next;
int j=1,e=0;
while(j<i&&p->next!=*L){
j++;
p=p->next;
}
if(j!=i){
printf("删除错误\n");
return -1;
}else{
p->next->prior=p->prior;//顺序不可
p->prior->next=p->next;//随意交换
e=p->data;
free(p);
printf("删除结点成功!\n");
return e;
}
}
int main()
{
DuLink L;
int n;
printf("请输入你要创建的结点个数\n");
scanf("%d",&n);
//Cre*Link(&L,n);
CreateDuLink(&L,n);
printElemt(L);
InsertNode(&L, 2);
printElemt(L);
int i;
scanf("%d",&i);
DelNode(&L, i);
printElemt(L);
return 0;
}
转载于:https://my.oschina.net/tanyonghu/blog/685640