#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*linklist;
//尾插法建立带表头节点的单链线性表
void createlist_l(linklist l,int n)
{
linklist q;
int i;
l=(linklist) malloc (sizeof(LNode));
l->next=0;
q=(linklist)malloc(sizeof(LNode));
printf("请输入结点的数据域\n");
for(i=n;i>0;i--)
{
scanf("%d",&q->data);
q->next=l->next;
l->next=q;
}
}
//在指定位置处插入一个节点
void listInsert_l(linklist l,int i,int e)
{
int j;
linklist p;
linklist q;
q=(linklist)malloc (sizeof(LNode));
p=(linklist)malloc (sizeof(LNode));
p=l;
j=1;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(j>i-1||!p)
printf("插入位置不合理");
else
{ q->data=e;
q->next=p->next;
p->next=q; }
printf("插入后的链表为:\n");
}
void listdelete_l(linklist l,int i)
{
linklist p;
linklist q;
int j;
q=(linklist)malloc(sizeof(LNode));
p=l;
for(j=1;j<i-1,!(p->next);j++)
p=p->next;
if(!p->next||j>i-1)
printf("删除位置不合理");
else
q=p->next;
printf("被删除的元素值是%d",q->data);
p->next=q->next;
free(q);
printf("删除后的链表为\n");
}
void print(linklist l)
{
linklist q;
q=l->next;
while(q!=0)
{
printf("%d,",q->data) ;
q=q->next;
}
}
void main ()
{
linklist l;
int n;
int k,e;
printf("请输入链表的元素个数\n");
scanf("%d",&n);
createlist_l(l, n);
printf("请输入所要插入的结点的位置及其数据域\n");
scanf("%d,%d",&k,&e);
listInsert_l(l, k,e);
print(l);
printf("请输入所要删除的结点的位置\n");
scanf("%d",&k);
listdelete_l(l, k);
print(l);
}
下面是根据你的代码修改的,以后尽量不要用字母“l”(小写的L)作变量,容易跟数字1弄混,且不方便阅读。还有写的时候注意指针的用法,如果你要修改参数,就要用这个变量的指针,此处就为二级指针,因为要传送的形参已经是个指针了。
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*linklist;
//尾插法建立带表头节点的单链线性表,注意,第一个参数为指向链表指针的指针,是个二级指针
void createlist(linklist *head,int n)
{
linklist q=NULL,p=NULL; // p 指向表尾结点;q 指向动态分配的结点,即新建立的结点
int i; // 循环变量
for(i=n;i>0;i--)
{
q=(linklist)malloc(sizeof(LNode)); // 动态分配一个结点
printf("请输入结点的数据域:\n"); // 提醒输入数据
scanf("%d",&(q->data) ); // 输入结点的数据域
if(*head==NULL) // 链表为空时
{
*head=q; // 动态分配的结点地址赋给头结点
} // end if
else // 链表不为空时
{
p->next=q; // 把动态分配的结点地址赋给表尾的next指针
} // end else
p=q; // p 指向新的表尾结点
}
p->next = NULL; // 表尾结点的next赋值为空
}
// 链表打印函数。由于打印函数不修改链表,所以参数为指向链表的指针,是个一级指针
void print(linklist head)
{
if(head==NULL) // 空链表的情况
{
printf("The list is empty.\n");
return ;
} // end if
// 链表不为空时
linklist q; // 定义循环指针变量
q=head; // 把 头结点指针赋给 q
while(q!=0) // 直到链表结束,while才结束
{
printf("%d,",q->data); // 打印该结点的数据域
q=q->next; // q 指向下一个结点
} // end while
}
//在指定位置处插入一个节点
void listInsert(linklist *head,int i,int e)
{
int j; // 循环变量
linklist p;
linklist q;
q=(linklist)malloc(sizeof(LNode)); // 动态分配一个结点空间
if(i==1) // 在表头插入
{
q->next = *head;// 新分配的结点的链接成员 next 指向现在的头结点
q->data = e;
*head = q; // 把新分配的结点地址赋值给头结点指针
return ; // 函数结束
} // end if
// 不在表头插入的情况
p=*head;
j=1;
while( ((p->next)!=NULL)&&(j<i-1) ) // 在链表内,寻找插入位置
{
p=p->next;
++j;
} // end while
if(j<i-1) // 要插入的位置大于量表元素个数,即不合理
{
printf("插入位置不合理\n");
return ;
} // end if
else // 插入位置合理时
{
if(p->next==NULL) // 在表尾插入
{
p->next = q;
q->next = NULL;
q->data = e;
} // end if
else // 在表中间插入
{
q->next = p->next;
p->next = q;
q->data = e;
} // end else
} // end else
}
// 删除结点函数。第一个参数为一个二级指针,因为要修改链表。
void listdelete(linklist *head,int i)
{
if(*head==NULL) // 链表为空时
{
printf("The list is empty.NO DELETE!\n");
return ;
} // end if
// 链表非空时
linklist q=NULL;
if(i==1) // 删除的表头
{
q=*head;
*head = (*head)->next;
free(q);
return ;
} // end if
// 删除的不是表头的情况
linklist p=NULL;
int j;
// q=(linklist)malloc(sizeof(LNode));
p=*head;
for(j=1;(j<i-1)&&(p->next->next!=NULL);) // 循环结束后1)如果删除位置合理,j=i-1。另外,若要删除的是表尾元素,
// 则同时p->next=NULL 2) 若删除位置不合理,则j<i-1,此时,p->next为NULL
{
j++;
p=p->next;
} // end for
if(j<i-1) // 删除位置不合理
printf("删除位置不合理\n");
else // 要删除元素的位置合理
{
if(p->next==NULL) // 要删除的是表尾元素
{
q=p->next;
printf("被删除的元素值是%d.",q->data);
p->next=NULL; // 表尾的next元素置为空
free(q); // 释放要删除的元素内存
} // end if
else // 要删除的是表中间的元素
{
q=p->next;
p->next=q->next; // 以上两句为连接要删除元素的前后两个元素
printf("被删除的元素值是%d.\n",q->data); // 输出要删除的元素值
free(q); // 释放要删除元素占用的内存
} // end else
} // end else
}
// 主函数
void main ()
{
linklist head = NULL; // 定义链表指针
int n;
int k,e;
printf("请输入链表的元素个数\n");
scanf("%d",&n);
createlist(&head, n); // 调用建立链表元素
print(head); // 调用打印链表函数
printf("\n请输入所要插入的结点的位置及其数据域:\n");
scanf("%d%d",&k,&e);
listInsert(&head, k,e); // 调用插入元素函数
printf("\n"); // 打印换行,为了输出结果更简明
printf("插入后的链表为:\n");
print(head); // 调用打印链表函数
printf("\n请输入所要删除的结点的位置\n");
scanf("%d",&k);
listdelete(&head, k); // 调用删除元素函数
printf("\n删除后的链表为:\n");
print(head); // 调用打印链表函数
printf("\n");
return ; // 主函数结束
}
运行结果:
这个程序哪里有问题,我想要做的是用c语言数据结构的方式实现链表的插入...
return 1;}void display(LinkList L){LinkList p=L->next;\/\/定义一个结点指针p指向头结点的下一个结点while(p){ \/\/如果p不为空则循环printf("%d ",p->data);p=p->next;\/\/移动指针p遍历链表}}void main(){LinkList lol;lol = (LinkList)malloc(sizeof(LNode));memset(lol,0,sizeof...
用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找
\/\/在la链表中的i位置插入数值e int j=1;
c语言 链表操作:建立,显示及节点的插入,删除
先写个头文件,包含链表的各种操作。具体代码如下:ifndef LINKEDLIST_H_INCLUDED define LINKEDLIST_H_INCLUDED \/\/线性表的单链表存储结构 struct LNode { ElemType data;LNode *next;};typedef LNode *LinkList; \/\/ 另一种定义LinkList的方法 \/\/单链表线性表的基本操作(12个)int InitList(LinkList...
用c语言调用实现带头结点的单链表的建立,插入,删除,查找的源代码
直接插入。小于的话,移动有序表后插入 int j= i-1; int x = a[i]; \/\/复制为哨兵,即存储待排序元素 a[i] = a[i-1]; \/\/先后移一个元素 while(x < a[j]){ \/\/查找在有序表的插入位置 a[j+1] = a[j]; j--; \/\/元素后移 } ...
...C语言程序,内容是建立一个链表,还有链表的插入与删除。
int listdelete(linklist &l,int i)\/\/在带头节点的单链表中删除第i个元素e,并返回其值 { int j=0;linklist p;p=new lnode;p=l;while(p->next&&jnext;++j;} if(!(p->next)||j>i-1){return 0;} linklist q;q=new lnode;q=p->next;p->next=q->next;m=q->data;free(q...
用C语言实现线性表的顺序存储(创建,插入,删除和查找)
cout<<"成功删除!!"; } p2=p1; p1=p1->next; } return head;}int save_info(char *filename,STUDENT *head,int flag)\/\/功能:将链表按Binary写入文件末尾\/\/参数:\/\/1.filename文件名,绝对地址\/\/2.head指向链表的头结点\/\/3.flag 0追加或1覆盖数据\/\/返回值:失败则返回0{ system("cls"); FILE *fp...
如何用C语言创建一个链表,实现增、删、改、查?
\/\/1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:NODE *creat_link(int direction){ NODE *head,*p,*tail;int xh,i=1;if(direction==1) \/\/当direction的值为1时,新建立的结点连到尾部 { tail=head=(NODE *)malloc(sizeof(NODE));h...
C语言单链表创建和排序问题代码问题,我运行时老是程序错误,不知道...
1、首先说说你的命名问题,不说其他的,在你的工程中,至少要统一化,比如这个函数命名,要么都是小写,要么都是开头大写,这样更让人容易理解。2、关于英文的问题,推荐你一个软件,有道翻译,我都是边写边查找翻译的。3、关于冒泡排序的问题,你可以在看看在百度百科上的例子。我其实不太习惯官方的...
在C语言环境中补充下列程序,完成线性单链表的初始化,插入,删除...
链表实例,一看全懂。(包括初始化,插入,删除等全套)
用C语言编写程序建立链表结构体类型实现链表初始化遍历和插入算法
define ok 1 define error 0 define overflow -1 typedef int status;typedef struct bitnode { telemtype data;struct bitnode *lchild,*rchild;}bitnode,*bitree;void preordertraverse(bitree T){ if(T){ printf("%c ",T->data);preordertraverse(T->lchild);preordertraverse(T->rchild);}...