双向链表:
比单向链表多了个前指针,操作没多大区别。
# include<stdio.h>
# include<stdlib.h>
typedef struct Node
{
struct Node * prev;
int data;
struct Node * pnext;
}node,*pnode;
pnode createlist(void)
{
int val;
char i;
pnode phead = (pnode)malloc(sizeof(node));
phead->pnext = NULL;
phead->prev = NULL;
printf("请输入添加的数据:\n");
scanf("%d",&val);
pnode pnew1 = (pnode)malloc(sizeof(node));
pnew1->data = val;
pnew1->pnext = phead->pnext;
pnew1->prev = phead;
phead->pnext = pnew1;
printf("是否继续加入?是:Y \否:N\n");
while(scanf("%s",&i),i!='n'&&i!='N')
{
printf("请输入数据:\n");
scanf("%d",&val);
pnode pnew = (pnode)malloc(sizeof(node));
pnew->data = val;
pnew->pnext = phead->pnext;
pnew->prev = phead;
phead->pnext = pnew;
printf("是否继续?是:Y /否:N\n");
}
return phead;
}
pnode createlist1(void)
{
int val;
char i;
pnode phead = (pnode)malloc(sizeof(node));
pnode ptail = phead;
phead->prev = NULL;
ptail->pnext = NULL;
printf("请输入添加的数据:\n");
scanf("%d",&val);
pnode pnew = (pnode)malloc(sizeof(node));
pnew->data = val;
ptail->pnext = pnew;
pnew->pnext = NULL;
pnew->prev = ptail;
ptail = pnew;
printf("是否继续加入?是:Y \否:N\n");
int cnt = 0;
while(scanf("%s",&i),i!='n'&&i!='N')
{
++cnt;
printf("请输入数据:\n");
scanf("%d",&val);
pnode pnew1 = (pnode)malloc(sizeof(node));
pnew1->data = val;
ptail->pnext = pnew1;
pnew1->pnext = NULL;
pnew1->prev = ptail;
ptail = pnew1;
printf("是否继续?是:Y /否:N\n");
}
printf("cnt = %d\n",cnt);
return phead;
}
void insert(pnode phead)
{
int val;
int pos,i = 0;
pnode p = phead;
printf("插入到几号位置?\n");
scanf("%d",&pos);
while(i<pos-1&&p!=NULL)
{
p = p->pnext;
++i;
}
if(p==NULL)
{
printf("插不进去\n");
return;
}
pnode pnew = (pnode)malloc(sizeof(node));
printf("请输入插入的数据\n");
scanf("%d",&val);
pnew->data = val;
pnew->pnext = p->pnext;
pnew->prev = p;
p->pnext = pnew;
}
void traverselist(pnode phead)
{
pnode p = phead->pnext;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->pnext;
}
printf("\n");
}
void deletelist(pnode phead)
{
int pos,i = 0;
pnode p = phead;
printf("要删除第几号节点?\n");
scanf("%d",&pos);
while(i<pos-1&&p!=NULL)
{
++i;
p = p->pnext;
if(p->pnext==NULL)
{
printf("删除失败!\n");
return;
}
}
pnode q = p->pnext;
p->pnext = q->pnext;
q->pnext->prev = p;
q->pnext = NULL;
q->prev = NULL;
free(q);
q = NULL;
}
int main(void)
{
pnode phead = createlist1();
//insert(phead);
traverselist(phead);
//deletelist(phead);
//traverselist(phead);
return 0;
}
单向链表:
具体看代码,写的最详细的一次,所有的我会的方法都包括进去了。
# include<stdio.h>
# include<stdlib.h>
typedef struct Node
{
int data;
struct Node * pnext;
}node,*pnode;
//插入方法(包括了排序,在构造链表是就实现了排序,边插边排)
void insert(pnode phead)
{
int val;
pnode p = phead;
printf("请输入要加入的数据:\n");
scanf("%d",&val);
pnode pnew = (pnode)malloc(sizeof(node));
pnew->data = val;
while(p->pnext!=NULL&&p->pnext->data<val)
p = p->pnext;
pnew->pnext = p->pnext;
p->pnext = pnew;
}
//调用插入方法来创建链表
pnode createlist1(void)
{
int val,i;
pnode phead = (pnode)malloc(sizeof(node));
pnode ptail = phead;
ptail->pnext = NULL;
printf("请输入数据:\n");
scanf("%d",&val);
pnode pnew = (pnode)malloc(sizeof(node));
pnew->data = val;
ptail->pnext = pnew;
pnew->pnext = NULL;
ptail = pnew;
printf("是否还继续?是:1 /否:0\n");
while(scanf("%d",&i),i!=0)
{
insert(phead);
printf("是否还继续加数据?是:1 /否:0\n");
}
return phead;
}
//普通的尾插法
pnode createlist2(void)
{
int i,len,val;
pnode phead = (pnode)malloc(sizeof(node));
pnode ptail = phead;
ptail->pnext = NULL;
printf("请输入节点个数:\n");
scanf("%d",&len);
for(i = 0;i<len;++i)
{
printf("第%d个节点的数据是:\n",i+1);
scanf("%d",&val);
pnode pnew = (pnode)malloc(sizeof(node));
pnew->data = val;
ptail->pnext = pnew;
pnew->pnext = NULL;
ptail = pnew;
}
return phead;
}
//普通的头插法构造
pnode createlist3(void)
{
int i,len,val;
pnode phead = (pnode)malloc(sizeof(node));
phead->pnext = NULL;//非常容易掉!!!!
printf("请输入节点个数:\n");
scanf("%d",&len);
for(i = 0;i<len;++i)
{
printf("第%d个节点的数据是:\n",i+1);
scanf("%d",&val);
pnode pnew = (pnode)malloc(sizeof(node));
pnew->data = val;
pnew->pnext = phead->pnext;
phead->pnext = pnew;
}
return phead;
}
//遍历输出
void traverselist(pnode phead)
{
pnode p = phead->pnext;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->pnext;
}
printf("\n");
}
//插入节点
void insertlist(pnode phead)
{
int pos,val,i = 0;
pnode p = phead;
printf("插入到链表的第几号位置?\n");
scanf("%d",&pos);
printf("请输入插入的数据:\n");
scanf("%d",&val);
//进行查找
while(i<pos-1&&p!=NULL)
{
++i;
p = p->pnext;
}
if(p==NULL)
{
printf("没有这号位置!!\n");
return;
}
//找到之后跟头插法一样插入。
pnode pnew = (pnode)malloc(sizeof(node));
pnew->data = val;
pnew->pnext = p->pnext;
p->pnext = pnew;
}
//删除节点(跟插入很像,都要先进行查找的步骤)
void deletelist(pnode phead)
{
int pos,val,i = 0;
pnode p = phead;
printf("删除链表的第几号位置?\n");
scanf("%d",&pos);
while(i<pos-1&&p!=NULL)
{
++i;
p = p->pnext;
if(p->pnext==NULL)
{
printf("没有这号位置!\n");
return;
}
}
//删除
pnode q = p->pnext;
p->pnext = q->pnext;
q->pnext = NULL;
free(q);
q = NULL;
}
//链表逆置(用头插法的原理逆置)
void reverselist1(pnode phead)
{
pnode p,q;
p = q = phead->pnext;
phead->pnext = NULL;
while(q!=NULL)
{
p = q;
q = q->pnext;
p->pnext = phead->pnext;
phead->pnext = p;
}
}
//用逆置指针的方法来逆置
pnode reverselist2(pnode phead)
{
pnode prev = NULL;
pnode cur = phead;
pnode temp = phead;
while(cur!=NULL)
{
temp = temp->pnext;
cur->pnext = prev;
prev = cur;
cur = temp;
}
return prev;
}
//与之配套的输出:
void traverselist1(pnode phead)
{
pnode p = phead;
while(p->pnext != NULL)
{
printf("%d ",p->data);
p = p->pnext;
}
}
int main(void)
{
pnode phead = createlist2();
//insertlist(phead);
//deletelist(phead);
//pnode pHead = reverselist2(phead);
//traverselist1(pHead);
traverselist(phead);
return 0;
}