代码
//链表
//带头结点
#include<stdio.h>
#include<stdlib.h>
struct ListElement
{
int num;
//char name[10];
ListElement *next;
};
typedef struct ListElement node;
typedef node* link;
//从表头插入新节点,返回表头指针
link creatHead()
{
link head=(link)malloc(sizeof(node));
link p,q;
q=head->next=NULL;
printf("==================从表头插入节点==============\n");
char ch='*';
printf("输入链表数据,以#结束\n");
int tem;
while('#'!=ch)
{
scanf("%d",&tem);
p=(link)malloc(sizeof(node));
p->num=tem;
head->next=p;
p->next=q;
q=p;
ch=getchar();//输入数字之间的空格或回车或结束符#赋给ch;
}
return(head);
}
//从表尾插入节点
link creatTail()
{
link head=(link)malloc(sizeof(node));
link p,q;
q=head;
printf("==================从表尾插入节点==============\n");
char ch='*';
printf("输入链表数据,以#结束\n");
int tem;
while('#'!=ch)
{
scanf("%d",&tem);
p=(link)malloc(sizeof(node));
p->num=tem;
q->next=p;
q=p;
ch=getchar();//输入数字之间的空格或回车或结束符#赋给ch;
}
q->next=NULL;
return(head);
}
//获取链表的节点数
int getLen(link head)
{
int j=0;
link p=head->next;
while(p)
j++;
}
void show(link head)
{
link p=head->next;//!!!空出头节点
while(p)
{
printf("%4d",p->num);
p=p->next;
}
printf("\n");
}
//按位置i查找
//返回指向位置i指针
link find(link head , int i)//暂不考虑i超出合理范围 ,否则用getLen()函数;
{
link p=head->next;
int j=1;
while(p&&(j++<i))
p=p->next;
return p;
}
//按值查找
//找到则输出指向该节点的指针
int Locate(link head, int x)
{
int i=1;
link p=head->next;
while(p&&(x!=p->num))
{
p=p->next;i++;
}
if(p)return i;
else return -1;
}
//插入节点
//在给定节点*q之后
//
int InsList(link q, int x)
{
link p;
if(p=(link)malloc(sizeof(node)))
{
p->num=x;
p->next=q->next;
q->next=p;
return 1;
}
else return -1;
}
//删除头指针head的链表(所有出现的)元素X
void DelList(link head, int x)
{
link p=head->next;
link q=head;
while(p)
{
while(p&&(x!=p->num))//p的条件不能省
{
p=p->next;
q=q->next;
}
q->next=p->next;
free(p);
if(p)
p=q->next;
}
/*if(!p)
{
printf("没找到元素%d.\n",x);
return -1;
}*/
}
int main()
{
printf("===========a1===========\n");
link a1=creatHead();
show(a1);
printf("===========a2===========\n");
link a2=creatTail();
show(a2);
printf("为查找a2第i位置的元素,输入i:\n");
int tem;
scanf("%d",&tem);
printf("查得位置%d的元素是%d.\n",tem,find(a2,tem)->num);
printf("===============================================\n");
printf("为判断a2是否含元素x,输入x:\n");
int x,y;
scanf("%d",&x);
if(-1==(y=Locate(a2,x)))
printf("a2不含元素%d\n",x);
else
printf("元素%d位于a2位置%d处.\n",x,y);
printf("===============================================\n");
printf("a2第m个位置后插入n个元素,输入(m,n):\n");
int m,n;
scanf("%d%d",&m,&n);
printf("输入这%d个元素:\n",n);
int pnum=0;
link pp=a2;
do
{
pp=pp->next;
pnum++;
}while(pnum<m);
int u,e;
for(u=1;u<=n;u++)
{
scanf("%d",&e);
InsList(pp,e);
pp=pp->next;
}
printf("修改后的a2: \n");
show(a2);
printf("===============================================\n");
printf("a2中,输入要删除的元素值:\n");
int numlast;
scanf("%d",&numlast);
DelList(a2,numlast);
printf("修改后的a2: \n");
show(a2);
return 0;
}
运行结果