网速可以再卡一点吗
——原始——
C语言实现的单链表
#include
#include
#include
typedef struct _Node
{
char name[32];
struct _Node *next;
} Node;
typedef struct _Node *PtrNode;//建立指向_Node类型数据的指针*PtrNode
void InitList(PtrNode *ls)//初始化链表
{
*ls = (PtrNode)malloc(sizeof(Node));
strcpy((*ls)->name, "Nothing"); //默认name值为Noting
(*ls)->next = NULL;//默认为空指针
}
void CreateList(PtrNode ls, int n)//尾插法建立链表,结点数为n个
{
PtrNode p, rear;
char tmpName[32];//声明字符数组
int i;
rear = ls;
for(i=0; i
{
p = (PtrNode)malloc(sizeof(Node));
scanf("%s", tmpName);
strcpy(p->name, tmpName);
rear->next = p; //给p节点的name、next赋值
rear = p; //rear回到链表最后位置
}
rear->next = NULL; //链表尾节点指向空
}
void TraverseList(PtrNode ls) //遍历打印
{
PtrNode p=ls->next;//p指向第一个结点
while(p!=NULL)
{
printf("%s->", p->name);
p = p->next;
}
printf("null\n");
}
PtrNode LocateElem(PtrNode ls, char key_name[32])//查找name值等于参数key_name的第一个结点,没有则返回空
{
PtrNode p, q;
p = ls;
q = ls->next;
while(q!=NULL)
{
if(strcmp(q->name, key_name)==0)
break; //找到与key_name相等的元素后直接跳出循环
p = q;
q = q->next;
}
if(q==NULL)
return NULL;
else
return p;//此时p->next就是要找的结点
}
PtrNode GetElem(PtrNode ls, int j)//找到链表中第j个结点
{
PtrNode p=ls;
int i=0;
if(j<0) return NULL;//参数不能小于0
while(p!=NULL&&i
{
p=p->next;
i++;
}
return p;
}
void InsertNode(PtrNode p, char newName[32])//将name值为newName的新结点插入到p的当前位置,p自动后移
{
PtrNode s = (PtrNode)malloc(sizeof(Node));
strcpy(s->name, newName);
s->next = p->next;
p->next = s;
}
void DeleteNode(PtrNode p)//删除结点p
{
PtrNode s=p->next;//暂存p的next值
if(s!=NULL)
{
p->next = s->next;
free(s);//销毁这个结点
}
}
void DestroyList(PtrNode *ls)//销毁链表ls
{
PtrNode p = *ls, q;
while(p!=NULL)//用p遍历ls,依次销毁ls的每一个结点
{
q = p;
p = p->next;
free(q);
}
*ls = NULL;
}
int GetLength(PtrNode ls)//返回ls的结点个数
{
PtrNode p=ls->next;
int i=0;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
void BubbleSort(PtrNode ls)//对链表进行冒泡排序,最终为升序
{
int i, j, n = GetLength(ls);
int bFlag=1;
char tmpName[32];
PtrNode p, q;
for(i=0; i
{
bFlag = 0;
p = ls->next;
for(j=0; j
{
q = p->next;
if(strcmp(p->name, q->name)>0)//strcmp:比较英文字符串大小,参数1大于参数2时执行if内的语句
{ //百度百科:strcmp
strcpy(tmpName, p->name);
strcpy(p->name, q->name);
strcpy(q->name, tmpName);//对调p和q的name值
bFlag = 1;
}
p = p->next;
}
}
}
//-------------------------------------------
int main()
{
int n=4;
PtrNode myLkList, pNode;
char keyName[32], newName[32];
InitList(&myLkList);//初始化
CreateList(myLkList, n);//插入4个结点
TraverseList(myLkList);//遍历打印
printf("请输入要查找的关键字\n");
scanf("%s", keyName);//输入要查找的keyName
pNode=LocateElem(myLkList, keyName);//pNode为此keyName的位置下标
if(pNode!=NULL)//若存在这个keyName就在这个结点的下一个位置插入一个新结点
{
printf("请输入要添加的新结点\n");
scanf("%s", newName);
InsertNode(pNode, newName);
}
TraverseList(myLkList);//遍历打印
pNode = GetElem(myLkList, 4);//查到到第4个结点
if(pNode!=NULL)//将此结点之后的统统删除
DeleteNode(pNode);
printf("删除第四个以后的结点:\n");
TraverseList(myLkList);//遍历打印
return 0;
}