今天下午花了2小时候左右把王道书上关于数据结构单链表部分的代码自己实现了一下,作此记录
顺序表之前已经实现了有空分享
很多函数还有很多其他的方法实现,欢迎补充,也接受批评。
具体代码如下
#include<stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList List_HeadInsert(LinkList &L);
LinkList List_TailInsert(LinkList &L);
LNode *GetElem(LinkList L,int i);
LNode *LocateElem(LinkList L,int i);
bool ListInsert1(LinkList &L,int i,int x);
bool ListInsert2(LNode *p,int x);
bool List_Delete(LinkList &L,int i,int &e);
int Length(LinkList L);
void List_ShowList(LinkList L);
void main(void) {
LinkList L1 = List_TailInsert(L1);
List_ShowList(L1);
LNode * p = GetElem(L1,2);
printf("查找结点中的数字为:%d\n",p->data);
ListInsert1(L1,3,5);
List_ShowList(L1);
LNode * p1 = LocateElem(L1,1);
ListInsert2(p1,9);
List_ShowList(L1);
printf("表的长度为:%d\n",Length(L1));
int e;
List_Delete(L1,3,e);
printf("所删除的结点中数据域的值为:%d\n",e);
List_ShowList(L1);
}
LinkList List_HeadInsert(LinkList &L) {
LNode *s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("请输入插入的数字");
scanf("%d",&x);
while(x != 9999) {
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
printf("请继续输入数字");
scanf("%d",&x);
}
return L;
}
LinkList List_TailInsert(LinkList &L) {
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode *s,*r = L;
printf("请输入插入的数字");
scanf("%d",&x);
while(x != 9999) {
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
printf("请继续输入数字");
scanf("%d",&x);
}
r->next = NULL;
return L;
}
LNode *GetElem(LinkList L,int i) {
int j = 1;
LNode * p = L->next;
if(i == 0)
return L;
if(i < 1)
return NULL;
while(p!=NULL && j<i) {
p = p->next;
j++;
}
return p;
}
LNode *LocateElem(LinkList L,int i) {
LNode *p = L->next;
while(p!=NULL && p->data!=i) {
p = p->next;
}
return p;
}
bool ListInsert1(LinkList &L,int i,int x) {
if(i < 1)
return false;
LNode * p = GetElem(L,i-1);
LNode * s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next = s;
return true;
}
bool ListInsert2(LNode *p,int x) {
LNode *s = (LNode *)malloc(sizeof(LNode));
s->next = p->next;
p->next = s;
s->data = p->data;
p->data =x;
return true;
}
bool List_Delete(LinkList &L,int i,int &e) {
LNode *p = GetElem(L,i);
LNode *q = p->next;
e = p->data;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
int Length(LinkList L) {
int len = 0;
LNode *p = L;
while(p->next!=NULL) {
p = p->next;
len++;
}
return len;
}
void List_ShowList(LinkList L) {
LNode * s = L->next;
printf("链表中的数据为:\n");
while(s != NULL) {
printf("%d ",s->data);s
s = s->next;
}
printf("\n");
}