您的位置:首页 > 编程语言 > C语言/C++

链表初解(二)——双链表的创建、删除、插入

2014-03-28 23:49 387 查看
下面是基本的双链表操作,由于双链表有两个方向,所以在删除和插入节点时,可以节省一个指针,只用一个链表上的指针和一个待操作的指针即可完成插入和删除;同时也要注意在编写双链表时对情况的判断要仔细,否则很容易出错~

#include<iostream>
using namespace std;

typedef struct student
{
int data;
struct student *next;
struct student *pre;
}dnode;

//建立双链表
dnode *create()
{
dnode *head, *p, *s;
int x;
head = (dnode *)malloc(sizeof(dnode));
p = head;
cout<<"\nInput the data : ";
while(1)
{
if(scanf("%d", &x) != EOF && x != 0)
{
s = (dnode *)malloc(sizeof(dnode));
s->data = x;
p->next = s;
s->pre = p;
p = s;
}
else break;
}
head = head->next;
head->pre = NULL;
p->next = NULL;
return head;
}

//双链表删除节点
dnode *del(dnode *head, int num)
{
dnode *p1;
p1 = head;
while(num != p1->data && p1->next != NULL)
p1 = p1->next;
if(num == p1->data)
{
if(head == p1)
{
head = head->next;
head->pre = NULL;
}/*此处的处理与单链表不同,因为双链表有两个方向,所以在定义时仅定义一个指针,
这使得当出现删除链表尾部时,由于NULL没有前驱,导致无法连接,所以要分开讨论。*/
else if(p1->next == NULL) p1->pre->next = NULL;
else
{//p1为最后一个节点,如没有上一个分支,则第二个语句会出错。
p1->pre->next = p1->next;
p1->next->pre = p1->pre;
}
free(p1);	//释放
}
else cout<<"There is no %d "<<num;
return head;
}

//双链表插入节点
dnode *insert(dnode *head, int num)
{
dnode *p0, *p1;
p1 = head;
p0 = (dnode *)malloc(sizeof(dnode));
p0->data = num;
while(num > p1->data && p1->next != NULL)
p1 = p1->next;
if(num <= p1->data)
{
if(head == p1)
{
p0->next = p1;
p1->pre = p0;
head = p0;
}
else
{
p1->pre->next = p0;
p0->pre = p1->pre;
p0->next = p1;
p1->pre = p0;
}
}
else
{//插入尾部~
p1->next = p0;
p0->next = NULL;
p0->pre = p1;
}
return head;
}

//计算表长
int length(dnode *head)
{
int n = 0;
while(head != NULL)
{
head = head->next;
n++;
}
return n;
}
//打印双链表
void print(dnode *head)
{
int n = length(head);
cout<<"Output the DoubleList ("<<n<<" records~) : ";
while(head != NULL)
{
if(head->next == NULL) cout<<head->data<<endl;
else cout<<head->data<<"<->";
head = head->next;
}
}
//排序函数同单链表,此处省略了~,默认输入为递增哈~
int main()
{
dnode *head;
//创建
head = create();
print(head);
//删除
int numD;
cout<<"\nDelete : ";
cin>>numD;
print(del(head, numD));
//插入
int numS;
cout<<"\nInsert : ";
cin>>numS;
print(insert(head, numS));
return 0;
}




Ps:仅供参考~~


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c C++ 双链表 链表 指针