定义
链表节点长这个样子,数据域data指针域next指向下一个结点
typedef struct lnode {
int data;
struct lnode *next;
}lnode ,*linklist;
初始化
/*初始化*/
linklist f1(){
linklist l=(linklist)malloc(sizeof(lnode));
l->next=NULL;
return l;
}
int main(){
linklist l;
l=f1();
}
初始化的结果,头结点为l的空链表
给链表输入数据
头插法
void f2(lnode*l,int n){
for(int i=0;i<n;i++){
lnode* p=(linklist)malloc(sizeof(lnode));
printf("请输入第%d个数",i+1);
scanf("%d",&p->data);
p->next=l->next;
l->next=p;
}
F();
}
头插法插入元素链表元素是相反的
改良一下
void f2(lnode*l,int n){
for(int i=0,j=n;i<n;i++,j--){
lnode* p=(linklist)malloc(sizeof(lnode));
printf("请输入第%d个数",j);
scanf("%d",&p->data);
p->next=l->next;
l->next=p;
}
F();
}
尾插法
void f4(linklist l,int n){
lnode *r;//尾指针
r=l;
for(int i=0;i<n;i++){
lnode* p=(linklist)malloc(sizeof(lnode));
printf("请输入第%d个数",i+1);
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
F();
}
查找
按值查找
void f5(linklist l, int e) {
lnode *p;
p = l;
int i = 1;
while (p) {
if (p->data == e) {
printf("%d 在第 %d 个位置", e, i);
break;
}
p = p->next;
i++;
}
if (!p) {
printf("元素 %d 不在链表中。", e);
}
F();
}
按位查找
void f6(linklist l,int i){
int length=1;
lnode *p,*q;
int ii=1;
p = l;
q=l->next;
while(p){
p=p->next;
length++;
}
if(i>length)
printf("位置输入不合法");
while (q){
if(ii==i){
printf("第%d个是%d",i,q->data);
}
q=q->next;
ii++;
}
F();
}
给指定位置i插入元素e
void f7(linklist l,int i,int e){
lnode *p=(lnode*)malloc(sizeof(lnode));
p->data=e;
for(int ii=1;ii<i;ii++)
l=l->next;
p->next=l->next;
l->next=p;
}
删除指定位置的元素
void f8(linklist l,int i){
lnode *p=(lnode*)malloc(sizeof(lnode));
for(int ii=1;ii<i;ii++)
l=l->next;
p=l;
l->next=l->next->next;
}
完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct lnode {
int data;
struct lnode *next;
}lnode ,*linklist;
void F(){
printf("\n");
printf("------------------------");
printf("\n");
}
/*初始化*/
linklist f1(){
linklist l=(linklist)malloc(sizeof(lnode));
l->next=NULL;
return l;
}
/*头插法*/
void f2(lnode*l,int n){
for(int i=0,j=n;i<n;i++,j--){
lnode* p=(linklist)malloc(sizeof(lnode));
printf("请输入第%d个数",j);
scanf("%d",&p->data);
p->next=l->next;
l->next=p;
}
F();
}
/*输出链表*/
void f3 (linklist l){
lnode *p;
p=l->next;//跳过头结点
printf("链表是");
while(p){
printf("%d ",p->data);
p=p->next;
}
F();
}
/*尾插法*/
void f4(linklist l,int n){
lnode *r;//尾指针
r=l;
for(int i=0;i<n;i++){
lnode* p=(linklist)malloc(sizeof(lnode));
printf("请输入第%d个数",i+1);
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
F();
}
/*按值查找 */
void f5(linklist l, int e) {
lnode *p;
p = l;
int i = 1;
while (p) {
if (p->data == e) {
printf("%d 在第 %d 个位置", e, i);
break;
}
p = p->next;
i++;
}
if (!p) {
printf("元素 %d 不在链表中。", e);
}
F();
}
/*按位查找*/
void f6(linklist l,int i){
int length=1;
lnode *p,*q;
int ii=1;
p = l;
q=l->next;
while(p){
p=p->next;
length++;
}
if(i>length)
printf("位置输入不合法");
while (q){
if(ii==i){
printf("第%d个是%d",i,q->data);
}
q=q->next;
ii++;
}
F();
}
/*给指定位置i插入元素e*/
void f7(linklist l,int i,int e){
lnode *p=(lnode*)malloc(sizeof(lnode));
p->data=e;
for(int ii=1;ii<i;ii++)
l=l->next;
p->next=l->next;
l->next=p;
}
/*删除指定位置的元素*/
void f8(linklist l,int i){
lnode *p=(lnode*)malloc(sizeof(lnode));
for(int ii=1;ii<i;ii++)
l=l->next;
p=l;
l->next=l->next->next;
}
int main(){
linklist l;
l=f1();
int a;
printf("请输入链表l的长度");
scanf("%d",&a);
// f2(l,a);
// f3(l);
f4(l,a);
f3(l);
//按值查找
// int e;
// q=l->next;
// scanf("%d",&e);
// f5(l,e);
//按位查找
// int i;
// printf("请输入要查找的位序");
// scanf("%d",&i);
// f6(l,i);
//给指定位置i插入元素e
// int i,e;
// printf("请输入要插入的位序");
// scanf("%d",&i);
// printf("请输入要插入的数字");
// scanf("%d",&e);
// f7(l,i,e);
// f3(l);
//删除指定位置的元素
// int i;
// printf("请输入要删除的位序");
// scanf("%d",&i);
// f8(l,i);
// f3(l);
}