怎样编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本 *** 作?

怎样编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本 *** 作?,第1张

typedef int Elemtype

typedef int status

#define OVERFLOW -2

#define OK 1

#define ERROR -1

#include "stdio.h"

#include "stdlib.h"

typedef struct LNode {

Elemtype data

struct LNode *next

}*linklist

/档绝/构造链表毁亮

void Create_Linklist(linklist &L)

{

linklist p

p=(linklist)malloc(sizeof(LNode))

if(!p)

exit(OVERFLOW)

L=p

L->next =NULL

}

//节点插入

void Insert_Linklist(linklist &L)

{

linklist p

int n,i

printf("请输入插入节点的个数n: ")

scanf("%d",&n)

getchar()

for(i=ni>0i--)

{

p=(linklist )malloc(sizeof(LNode))

scanf("%d",&p->data)

p->next=L->next

L->next =p

}

}

//遍历输出并输出长度

status Visit_linklist(linklist &L)

{

linklist p

int i=1

p=L->next

if(L->next==NULL)

return ERROR

while(p->next !=NULL)

{

printf("%d ",p->data )

p=p->next

i++

}

printf("%d\n",p->data )

printf("长度为:%d\n",i)

return OK

}

//查找值为x的直接前驱结点q并输出

void Search_linklist(linklist &L)

{

int x,k=0

linklist p=L,q

printf("输入x: ")

scanf("%d",&x)

getchar()

if(L->next ==NULL)

printf("该表为空 !\n")

while(p->next!=NULL)

{

q=p

if(p->next ->data ==x)

{

printf("%d ",q->data )

k=1

}

p=p->next

}

if(p->next &&p->data ==x)

{

printf("%d ",p->data )

k=1

}

if(k==0)

printf("未找到值为%d的结点\n",&x)

printf("\n")

}

/行余姿/删除节点

status Delete_linklist(linklist &L)

{

linklist p,q

int k=0,x

printf("请输入删除节点的值x: ")

scanf("%d",&x)

getchar()

if(L->next ==NULL)

return ERROR

p=L

q=L->next

while(q!=NULL)

if(q->data ==x)

{

k=1

p=q

p->next =q->next

free(q)

q=p->next

}

else

{

p=q

q=p->next

}

if(k==0)

printf("表中没有值为%d的结点!\n",&x)

return OK

}

//链表逆置

void ListInverse_linkliast(linklist &L)

{

linklist k,p,q

p=L

while (p->next !=NULL)

{

p=p->next

}

k=p

while (L->next !=p)

{

q=L->next

L->next = q->next

k->next =q

}

}

//链表奇偶分解

void Break_linklist (linklist &La,linklist &Lb)

{

linklist p,q

p=La->next

q=Lb

while(p->next!=NULL)

{

if(p->data %2==0)

{

q->next =p

q=q->next

}

p=p->next

}

if(p->data %2==0)

{

q->next =p

q=q->next

}

}

//主菜单

void main()

{

linklist L1,L2

printf(" (1) 建立带头节点的单链表\n")

printf(" (2) 插入节点\n")

printf(" (3) 计算链表长度并输出单链表\n")

printf(" (4) 查找值为x的直接前驱结点并输出其值\n")

printf(" (5) 删除节点值为x的结点\n")

printf(" (6) 逆置单链表结点\n")

printf(" (7) 单链表奇偶分解\n")

int choice

printf(" 请输入选择:")

while(scanf("%d",&choice))

{

getchar()

printf("\n\n")

switch(choice)

{

case 1:

Create_Linklist(L1)

break

case 2:

Insert_Linklist(L1)

break

case 3:

Visit_linklist(L1)

break

case 4:

Search_linklist(L1)

break

case 5:

Delete_linklist(L1)

break

case 6:

ListInverse_linkliast(L1)

break

case 7:

Create_Linklist(L2)

Break_linklist (L1,L2)

break

default:

printf(" 输入有误!")

break

}

}

}

这嫌念是个很简单的链表创建和输出

#include<stdio.h>

#include<stdlib.h>

typedef struct linkednode

{

char data

struct linkednode *next

}node,*link_list//链表节点的结构及重命名

link_list creat()//创建一个逗判链表返回类型是链表的首地址

{

link_list L

node *p1,*p2

char data

L=(node*)malloc(sizeof(node))//开辟存储空间

p2=L

while((data=getchar())!='\n')//输入回车键时结束输入

{

p1=(node*)malloc(sizeof(node))

p1->data=data

p2->next=p1

p2=p1

}

p2->山者改next=NULL

return L

}

void print(link_list L)//把链表输出

{

node *p

p=L->next

while(p!=NULL)

{

printf("%c",p->data)

p=p->next

}

printf("\n")

}

void main()

{

link_list L=NULL

char x

printf("请输入链表节点:\n")

L=creat()

print(L)

}

//兄弟,好好看看带头结点和不带头结点的链表的区别,还有如果你设了全局变量n记录链表长度,length()这个函数就多余了,你可以在删除数据时把n-1,插入数据时把n+1就行了,我简单改了改,你看看吧!!

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef struct node

{

int data

struct node *next

}slink

int n

slink *creat() //创建链表

int insert(slink *head,int i,int x)//在结点i之前播放一个数x

int del(slink *head,int i,int *x) //删除第i个结点并返回该结点上的数值

slink *get(slink *head,int i) //查找第i个结点,并返回

int length(slink *head) //求链表的长度

void print(slink *head) //输出链表

int main()

{

slink *head

int de,num=0,ins,len //de为要删除的结点,ins为要插入的结点

//这里num要用整形数,不用指针

printf("input records:\n")

head=creat()

print(head)

printf("\ninput the delete number:(the number<%d)",n)

scanf("%d",&de) /键含笑/这里少了一个&符

if(del(head,de,&num)==1)

{

print(head)

printf("%d",num)

}

else

printf("delete failure!")

printf("\ninput the inset record:")

scanf("%d",&ins)

if(insert(head,2,ins)==1)

print(head)

else

printf("the insert is failure!")

len=length(head)

printf("the length is %d\n",len)

return 0

}

slink *creat() /*定义函数,返回带头结点的链表*/ //兄弟,你建的是不带头结点的链表,带头结点的链表的头结点是不存数据的!!!

{

slink *head

slink *p1,*p2

n=0

head=NULL

p1=p2=(slink*)malloc(sizeof(slink))

scanf("%d",&p1->data)

while(p1->data!=0)

{

n=n+1

if(n==1) head=p1

else p2->next=p1

p2=p1

p1=(slink*)malloc(sizeof(slink))

scanf("%d",&p1->data)

}

p2->next=NULL

return (head)

}

int insert(slink *head,int i,int x)

{

slink *p,*pre,*q

int j=0

p=(slink*)malloc(sizeof(slink))

p->data=x

pre=head/*pre指向待插入结点的前驱结点*/

q=head->next /*q指向当前比较结点*/

while(q&&j<i-1) /*查找p结点应该插入的位置*/

{pre=q

q=q->next

j++

}

if(j!=i-1||i<1) return 0 /*插入不成功*/老局

else

{p->next=q /*将p结点插入链表*/

pre->next=p

}

return 1 /*插入成功*/

}

int del(slink *head,int i,int *x)/*删除第i个结点稿含,并通过x返回值*/

{

slink *p,*q

int j=0

p=head

while(p->next&&j<i-1) /*查找第i个结点的前驱位置p*/

{

p=p->next

j++

}

if(!(p->next)||j>i-1) return 0 /*删除位置不合适*/

q=p->next /*删除并释放结点*/

p->next=q->next

*x=q->data

free(q)

n-- //删除了数据,总数n应该减1吧?

return 1

}

slink *get(slink *head,int i) /*查找第i个结点*/

{slink *p

int j=0

p=head

while(p->next&&j<i-1) /*查找第i个结点的前驱*/

{p=p->nextj++}

if(!(p->next)&&j>i-1) return NULL

return p->next

}

int length(slink *head) /*求表的长度*/

{int len=0

slink *p

p=head /*设该表有表头*/

while(p){p=p->nextlen++} //你建的是不带头链表,所以这里少了一个

return len

}

void print(slink *head)

{slink *p

printf("\nNow,these %d records are :\n",n)

p=head

if(head!=NULL)

do

{printf("%d \n",p->data)

p=p->next

}while(p!=NULL)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8263222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存