【文件属性】:
文件名称:带头结点链表的各种操作(c语言)
文件大小:2KB
文件格式:H
更新时间:2013-11-15 17:16:46
链表操作
/*带头结点头文件 hlinklist.h*/
#include
typedef int datatype;
typedef struct link_node
{
datatype data;
struct link_node *next;
}node;
/*初始化链表*/
node *init()
{
node *head;
head=(node *)malloc(sizeof(node));
head->next=0;
return head;
}
/*尾插法创建一个带头结点链表*/
node *creat(node *head)
{
node *r,*s;
int x;
r=head;
printf("在新链表中输入数据以0结束:");
scanf("%d",&x);
while(x)
{
s=(node*)malloc(sizeof(node));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=0;
return head;
}
/*打印链表的结点值*/
void print(node *head)
{
node *p;
p=head->next;
if(!p)
printf("链表内容为空!");
else
while(p)
{
printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
/*在单链表中查找第i个结点的地址*/
node *find(node *head,int i)
{
node *p=head;
int j=0;
if(i<0)
{printf("不存在!");return 0;}
if(i==0) return head;
while(p&&i!=j)
{
p=p->next;
j++;
}
return p;
}
/*在带头结点的单链表第i个位置后插入一个数*/
node *insert(node *head,int i,datatype x)
{
node *p,*q;
q=find(head,i);
if(!q)
{ printf("插入的位置不存在!\n");return head;}
else
{
p=(node *)malloc(sizeof(node));
p->data=x;
p->next=q->next;
q->next=p;
}
return head;
}
/*在带头结点的单链表中删除一个为x的值*/
node *dele(node *head,datatype x)
{
node *pre=head,*p;
p=head;
while(p&&p->data!=x)
{
pre=p;p=p->next;
}
if(p)
{
pre->next=p->next;
free(p);
}
return head;
}
/*把带头结点的单链表倒置(以结点形式 )*/
node *Dao_zhi(node *head)
{
node *p,*s;
p=head->next;
head->next=NULL;
while(p)
{
s=p;
p=p->next;
s->next=head->next;
head->next=s;
}
return head;
}
/*删除链表中重复的结点 */
node *dele1(node *head)
{
node *pre,*p,*q;
if(head->next==0||!head->next->next)
{
printf("链表为空!");
return head;
}
//pre=head->next;
q=head->next;
while(q)
{
pre=q;
p=q->next;
while(p)
{
while(p&&q->data!=p->data)
{
pre=p;p=p->next;
}
if(p)
{
pre->next=p->next;
free(p);
}
p=pre->next;
}
q=q->next;
}
return head;
}