数据结构如何实现线性链表的基本操作,如插入删除修改逆序等?

2025-05-18 01:19:17
推荐回答(1个)
回答1:

下面这个程序基本上就是单链表的基本操作,是一个完整的可以在机器上运行的程序。供参考。
#include /* malloc()等 */
#include /* scanf(),NULL */
#include /* free() */
#include /*getch()*/

/* 函数结果状态代码 */
#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

void CreateList(LinkList *L,int n) /* 算法2.11 */
{ /* 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L */
int i;
LinkList p;
*L=(LinkList)malloc(sizeof(struct LNode));
(*L)->next=NULL; /* 先建立一个带头结点的单链表 */
printf("请输入%d个数据\n",n);
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
scanf("%d",&p->data); /* 输入元素值 */
p->next=(*L)->next; /* 插入到表头 */
(*L)->next=p;
}
}

void CreateList2(LinkList *L,int n)
{ /* 正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表L */
int i;
LinkList p,q;
*L=(LinkList)malloc(sizeof(struct LNode)); /* 生成头结点 */
(*L)->next=NULL;
q=*L;
printf("请输入%d个数据\n",n);
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
q->next=p;
q=q->next;
}
p->next=NULL;
}

void Printlinklist(LinkList L)
{
LNode *p;
p=L->next;
while(p)
{printf("%d",p->data);
if(p->next) printf("-->");
p=p->next;
}
printf("\n");
}

Status ListInsert(LinkList L,int i,ElemType e) /* 算法2.9。不改变L */
{ /* 在带头结点的单链线性表L中第i个位置之前插入元素e */
int j=0;
LinkList p=L,s;
while(p&&j {
p=p->next;
j++;
}
if(!p||j>i-1) /* i小于1或者大于表长 */
return ERROR;
s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
s->data=e; /* 插入L中 */
s->next=p->next;
p->next=s;
return OK;
}

Status ListDelete(LinkList L,int i,ElemType *e) /* 算法2.10。不改变L */
{ /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
int j=0;
LinkList p=L,q;
while(p->next&&j {
p=p->next;
j++;
}
if(!p->next||j>i-1) /* 删除位置不合理 */
return ERROR;
q=p->next; /* 删除并释放结点 */
p->next=q->next;
*e=q->data;
free(q);
return OK;
}

void main()
{
int i,n=5;
LinkList La,Lb;
ElemType e1,e2;
printf("头插法逆位序建表\n ");
CreateList(&La,n); /* 逆位序输入n个元素的值 */
printf("La= "); /* 输出链表La的内容 */
Printlinklist(La);
printf("\n");
printf("按尾插法正序建表:\n");
CreateList2(&Lb,n); /* 逆位序输入n个元素的值 */
printf("Lb= "); /* 输出链表Lb的内容 */
Printlinklist(Lb);
printf("\n");
printf("输入插入的位置i= ");
scanf("%d",&i);
printf("\n");
printf("输入插入的元素e1= ");
scanf("%d",&e1);
printf("\n");
ListInsert(La,i,e1);
printf("插入后La= "); /* 输出链表La的内容 */
Printlinklist(La);
printf("\n");
printf("输入删除的位置i= ");
scanf("%d",&i);
printf("\n");
ListDelete(Lb,i,&e2);
printf("删除后Lb= "); /* 输出链表La的内容 */
Printlinklist(Lb);
printf("\n");
printf("被删除的元素的值e2= %d\n",e2);
printf%